1

我正在使用带有 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)
4

3 回答 3

3

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

session.query(Foo).get(id)

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

于 2010-09-04T05:28:39.090 回答
2

不幸的是,SQLAlchemy 不允许您在Base没有相应表声明的情况下进行子类化。您可以将mixin 类定义为get_by_idclassmethod,但是您需要为每个类指定它。

一个更快更脏的解决方案是将其猴子修补到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在定义时有一个可用的对象,否则您每次都需要将其作为参数传递。

于 2010-09-03T18:23:05.850 回答
0
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)
于 2010-09-03T18:14:04.530 回答