如何为Sqlalchemy中的各种模型编写一个通用的get_by_id()方法?

2024-10-04 11:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是塔和炼金术。我有几个模型,发现自己一次又一次地编写这样的代码:

question = Session.query(Question).filter_by(id=question_id).one()
answer = Session.query(Answer).fileter_by(id=answer_id).one()
...
user = Session.query(User).filter_by(id=user_id).one()

由于模型都是扩展类Base,有没有办法定义一个通用的get_by_id()方法?在

所以我可以用它作为:

^{pr2}$

Tags: 代码answer模型idbysessionfilterquery
3条回答
class Base(object):
    @classmethod
    def get_by_id(cls, session, id):
        q = session.query(cls).filter_by(id=id)
        return q.one()

Question.get_by_id(Session, question_id)

如果id是主键列,则只需执行以下操作:

session.query(Foo).get(id)

它的优点是如果该实例已经在会话中,则不会查询数据库。在

不幸的是,SQLAlchemy不允许您在没有相应表声明的情况下子类Base。您可以将带有get_by_idmixin class定义为一个类方法,但是您需要为每个类指定它。在

一个更快更脏的解决方案是只需将其嵌入Base

def get_by_id(cls, id, session=session):
    return session.query(cls).filter_by(id=id).one()

Base.get_by_id = classmethod(get_by_id)

这假设在定义时有一个session对象可用,否则每次都需要将其作为参数传递。在

相关问题 更多 >