为了让自己熟悉这门语言,我在业余时间编写了一个简单的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()
我觉得我已经超出了我的能力范围,但我也很难决定什么是‘最佳实践’,或者如何去研究它。到目前为止,我找到的示例和教程大多是片断,但我正在寻找通用的项目结构化。任何帮助我指明正确方向的人都将不胜感激。
1条答案
按热度按时间yzuktlbb1#
对我来说,SqlalChemy最直观的结构是有一个db模块来创建引擎、基础和会话。我为每个功能组创建模块,主要用于命名,并使用类(表),这些类(表)通常还为‘Fire and Forget’突变提供SAVE()函数。这些模块形成一个组件,它们有自己的日志、错误处理、启动和维护。
因此,在我的项目中,这是第一个明确分离石化材料的项目。然后是一组模块,这些模块具有实现业务逻辑的功能,但严重依赖于SQLALCHEMY。复杂的查询、事务和数据传输发生在此组件中。这些功能可以被视为工作者和帮助者。
因此,用户界面、http、调度器和主要组件几乎从不等待sqlalChemy/数据库。这绝不是强制的,但在像你这样的情况下,在Main中做这件事感觉不合适,它有助于决定在哪里做什么。一般来说,它支持您的工作流,尤其是在调试、重构和编写日志时。但不要花太多精力来规划结构;没有完美的方法,事情总是会随着时间的推移而变化。