sqlite 使用SqlalChemy构建.py项目

ecr0jaav  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(201)

为了让自己熟悉这门语言,我在业余时间编写了一个简单的Python项目,但现在我想把它提升到一个层次。这包括将数据存储到数据库以备保存。然而,我很难弄清楚我的项目的结构。我的第一次尝试通过循环依赖锁定了我。
我有一个_dbhandler.py;

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import os

engine = create_engine(os.getenv('DB'), echo=True)
Base = declarative_base(bind=engine)
Session = sessionmaker(bind=engine)

根据sqlalchemy documentation,如果我想要将其数据存储到数据库中,这就是我想要构造我的python对象的方式;

from sqlalchemy import Column, DateTime, Integer, Unicode
from _dbhandler import Base, Session

class ServerSettings(Base):
    __tablename__ = 'ServerSettings'
    guildID = Column(Integer, primary_key=True)
    channelID = Column(Integer)

    def __init__(self, guild_id):
        self.guild_id = guild_id
        self.channel_id = None

现在,我最初的尝试是将对服务器设置对象的任何修改通过一个“保存方法”放在数据库处理程序中;

# store a changed channel id to the db
async def save_channel(guild_id, channel_id):
    with Session() as session:
        settings_obj = (session.query(ServerSettings).filter_by(guildID=guild_id).first())
        settings_obj.channel_id = channel_id
        session.commit()

但是,为了能够编译,我需要添加from _serversettings import ServerSettings。当我这样做时,我会得到循环依赖,并将自己锁在外面。我试着把它移到ServerSetChannel-方法中,但感觉不太合适。把它放在那里会迫使我移动任何“GetServerSetting”--在main.py中编辑对象的方法--我已经“了解到”,在一个干净的项目中,这应该是尽可能空的。最重要的是,这个方法变得有些臃肿--寻找一个数据库记录来引用它自己。

def set_channel(self, channel):
    if channel is not None:
        self.channel_id = channel.id
    else:
        self.channel_id = None

    with Session() as session:
        settings_obj = (session.query(ServerSettings).filter_by(guildID=self.guild_id).first())
        settings_obj.channel_id = self.channel_id
        session.commit()

我觉得我已经超出了我的能力范围,但我也很难决定什么是‘最佳实践’,或者如何去研究它。到目前为止,我找到的示例和教程大多是片断,但我正在寻找通用的项目结构化。任何帮助我指明正确方向的人都将不胜感激。

yzuktlbb

yzuktlbb1#

对我来说,SqlalChemy最直观的结构是有一个db模块来创建引擎、基础和会话。我为每个功能组创建模块,主要用于命名,并使用类(表),这些类(表)通常还为‘Fire and Forget’突变提供SAVE()函数。这些模块形成一个组件,它们有自己的日志、错误处理、启动和维护。
因此,在我的项目中,这是第一个明确分离石化材料的项目。然后是一组模块,这些模块具有实现业务逻辑的功能,但严重依赖于SQLALCHEMY。复杂的查询、事务和数据传输发生在此组件中。这些功能可以被视为工作者和帮助者。
因此,用户界面、http、调度器和主要组件几乎从不等待sqlalChemy/数据库。这绝不是强制的,但在像你这样的情况下,在Main中做这件事感觉不合适,它有助于决定在哪里做什么。一般来说,它支持您的工作流,尤其是在调试、重构和编写日志时。但不要花太多精力来规划结构;没有完美的方法,事情总是会随着时间的推移而变化。

相关问题