5

これは、私が sqlalchemy で使用している非常に単純なコードであり、クラスの動作に関する基本的なものが欠けています。

class Game(Base):
    __tablename__ = "games"

    id = Column(Integer, primary_key=True)
    a_name = Column(String)

    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
             setattr(self, k, v)
        print 'hi'
        self.away_dictionary =  {'name': self.a_name}

    @hybrid_property
    def stuff(self):
        return self.away_dictionary

次のクエリが機能します。

session.query(Game).first().a_name

ただし、次のクエリはエラーを返します。

session.query(Game).first().stuff
'Game' object has no attribute 'away_dictionary'

さらに基本的な問題もあります。Game クラスにクエリを実行すると、「hi」が出力されません。Game インスタンスを使用するたびに「hi」が出力されない理由を誰か説明してもらえますか? 2 番目の質問は、このクラスの各インスタンスに必要な away_dictionary を作成してアクセスするにはどうすればよいかということです。

4

4 に答える 4

1

コメントありがとうございます。それは私だけですか、それともsqlalchemyがややこしいですか?

とにかく、人々が上で指摘したように__init__、クエリを実行するときにメソッドが呼び出されないようです。

__init__データベース行からオブジェクトを再作成する場合、SQLAlchemy ORM は呼び出されません。ORM のプロセスは、Python 標準ライブラリの pickle モジュールに似ており、低レベルの__new__ メソッドを呼び出してから、 を呼び出すのではなく、インスタンスで直接静かに属性を復元します__init__

これに対する解決策は、次のコードを追加することです。

from sqlalchemy.orm import reconstructor
@reconstructor
awesome_true_init(self):
    self.away_dictionary = {'hi': 'i work!!'}

この関数は本物のように振る舞い__init__、オブジェクトを作成するたびに呼び出されます!!

于 2013-06-23T03:40:03.150 に答える
0

上記のクエリで Game インスタンスを作成するのではなく、Game クラス オブジェクトのみを渡します。したがって、init () コンストラクターは呼び出されません。クエリに Game インスタンスが必要な場合は、これが必要です: session.query(Game()).first().stuff.

于 2013-06-23T00:42:25.350 に答える
-2

理由 session.query(Game).first().a_nameは機能しますが、session.query(Game).first().stuff機能しないのは単純な構文上の問題です。a_name は Game クラスの属性である変数なので、a_name と入力するだけで参照できます。一方、 stuff はそのクラスのメソッドであるため、この場合のように、中に何もない場合でも、その後に一対の括弧が必要です。ということで使ってみてくださいsession.query(Game).first().stuff()

initは、そのコンストラクターを使用してオブジェクトを作成するときにのみ呼び出されるため、クエリが実行していないため、「hi」は出力されません。

于 2013-06-23T00:47:44.600 に答える