9

私のモデルは非常に複雑で、既存のストアド プロシージャからロジックを取得して SQLAlchemy に変換しようとしています (移植性の理由から)。

ただし、コミットされていないデータに苦労しています。

私はuserテーブルを持っています: 1d, 名前 私はstatusテーブルを持っています: id, 名前 私はuser_statusesテーブルを持っています: id, user_id, status_id, from_dt, to_dt

ここで、これらすべてのテーブルを 1 つのトランザクション内で作成する必要があります。そうしないと、失敗します。問題:

user = User(name = 'Test')
status = Status(name = 'Active')
db.session.add(user)
db.session.add(status)

# Oooopa! This is where it fails
user_session = UserStatuses(user_id=user.id, status_id=status.id, datetime.utcnow(), datetime(9999,01,01,00,00,00))
# both user.id and status.id = None as it's uncommited!

基本的に、明示的な SQL なしでテーブル シーケンスにアクセスできる必要があります。なんで?携帯性のため。現在、私はPGSQLを使用しており、これを行うことができます:

class User(Base):
    ....
    @staticmethod
    def prefetch_id():
        db.session.execute("SELECT NEXTVAL('user_id_seq');").scalar()

エンジンを MySQL & BANG! に変更します。アプリケーションが壊れています。

これを行う方法についてのアイデアはありますか?これは、一度に数千のユーザーがアクセスする非常にトランザクションの多いアプリケーションである可能性があることに注意してください。

4

2 に答える 2

17

答えが見つかりました - なぜ以前にこれを見なかったのかわかりません!

Sequence オブジェクトには、SQL 式のようにスタンドアロンで実行する機能もあり、「次の値」関数を呼び出す効果があります。

seq = Sequence('some_sequence')
nextid = connection.execute(seq)
于 2013-02-25T20:11:59.823 に答える
4

モデル オブジェクトを追加した後、コミットする前にセッションをフラッシュする場合:

db.session.add(user)
db.session.add(status)
db.session.flush()

次に、オブジェクトadd()のシーケンス列 ( id) が更新されるのでuser.id、それ以上は更新されstatus.idませんNone

于 2015-12-15T14:02:53.447 に答える