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

我正在使用sqlalchemy的挂架。我有几个模型,发现自己一次又一次地编写了这样的代码:
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()
方法? 所以我可以用它作为:
quesiton = Question.get_by_id(question_id)
answer = Answer.get_by_id(answer_id)
...
user = User.get_by_id(user_id)
    
已邀请:
遗憾的是,如果没有相应的表声明,SQLAlchemy不允许您子类化
Base
。您可以使用
get_by_id
定义一个mixin类作为类方法,但是您需要为每个类指定它。 一个更快更脏的解决方案就是将它修补成
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
对象,否则您每次都需要将其作为参数传递。     

bab

如果
id
是您的主键列,您只需执行以下操作:
session.query(Foo).get(id)
如果该实例已在会话中,则具有不查询数据库的优点。     
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)
    

要回复问题请先登录注册