2

テストスイートで問題が発生しました。私は、nosetests、SQLAlchemy、Flask、および Factory-Boy を使用したセットアップを使用しています。

次のコードがあります。

def _create_fixtures(self):
    self.user = UserFactory()
    pprint(db.query(User).all())
    db.add(self.user)
    pprint(db.query(User).all())

魔女は次のように返します:

[<User #1>, <User #2>]
[<User #1>, <User #2>]

私の UserFactory は次のようになります。

class UserFactory(Factory):
    FACTORY_FOR = User
    FACTORY_SESSION = db
    email = Sequence(lambda n: 'user{0}@wohnortfinder.com'.format(n))
    password = "password"
    username = Sequence(lambda n: 'user{0}'.format(n))

(はい、SQLAlchemy ファクトリではなく、通常のファクトリを使用しています。これも機能しなかったためです)

Factory オブジェクトが db に保存されないのはなぜですか? エラーは発生しませんが、保存されません。つまり、現在のトランザクションがまだコミットされていない場合でも、クエリは後で実際のトランザクションをクエリする必要がありますね。

奇妙なことに、セッションを手動でコミットすると、エラーが発生します。

InvalidRequestError: No transaction is begun.

セッションオブジェクトを作成するときにトランザクションを開始しましたが。

def init_engine(uri, **kwargs):
    global engine
    engine = create_engine(uri, **kwargs)
    Base.metadata.create_all(engine)
    db.begin()
    return engine


engine = None

db = scoped_session(lambda: create_session(bind=engine))

なぜこれが機能しないのですか?

ご感想ありがとうございます

4

2 に答える 2

10

SQLAlchemy セッションを設定せずに factory_boy ファクトリを定義し_meta、ファクトリ クラスのプロパティに割り当てることで、Flask アプリの初期化とファクトリの使用の間に設定できます。

db_session = set_up_a_db_session_somehow()
MyFactoryClass._meta.sqlalchemy_session = db_session

これは、スコープされたセッションでうまくいくようです。

于 2014-09-21T03:23:35.827 に答える