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()

モデルはすべてextend classBaseであるため、共通のメソッドを定義する方法はあります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

Base残念ながら、SQLAlchemy では、対応するテーブル宣言なしでサブクラス化することはできません。classmethod でmixin クラスを定義することもできますget_by_idが、その場合はクラスごとに指定する必要があります。

より迅速で汚い解決策は、モンキーパッチを次のように適用すること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 に答える