自動インクリメントのプライマリキーを使用してテーブルを作成した場合、プライマリキーを取得する方法(プライマリキーを予約する)実際にコミットしていますか?SQLAlchemyコミット前の自動インクリメントによるプライマリキーの取得
トランザクション内に2つの操作を配置したいのですが、操作の1つは前の操作で割り当てられた主キーに依存します。
自動インクリメントのプライマリキーを使用してテーブルを作成した場合、プライマリキーを取得する方法(プライマリキーを予約する)実際にコミットしていますか?SQLAlchemyコミット前の自動インクリメントによるプライマリキーの取得
トランザクション内に2つの操作を配置したいのですが、操作の1つは前の操作で割り当てられた主キーに依存します。
複数のトランザクションを使用して、範囲内で管理することができます。
commit
を入力する必要はありません。flush
が必要です。ここにいくつかのサンプルコードがあります。 flushへの呼び出し後、割り当てられた主キーにアクセスできます。これはSA 0.4.8であることに注意してください。
from sqlalchemy import *
from sqlalchemy.databases.mysql import *
import sqlalchemy.ext.declarative
Base = sqlalchemy.ext.declarative.declarative_base()
class User(Base):
__tablename__ = 'user'
user_id = Column('user_id', Integer, primary_key=True)
name = Column('name', String)
if __name__ == '__main__':
import unittest
from sqlalchemy.orm import *
import datetime
class Blah(unittest.TestCase):
def setUp(self):
self.engine = create_engine('sqlite:///:memory:', echo=True)
self.sessionmaker = scoped_session(sessionmaker(bind=self.engine))
Base.metadata.bind = self.engine
Base.metadata.create_all()
self.now = datetime.datetime.now()
def test_pkid(self):
user = User(name="Joe")
session = self.sessionmaker()
session.save(user)
session.flush()
print 'user_id', user.user_id
session.commit()
session.close()
unittest.main()
いいコード例のために心のこもった+1! –
好奇心の高まりから、これは現代のSQLAlchemy v0.8.0ではまだまだ乱雑ですか?それとも簡単な方法がありますか? – Mittenchops
** flush **へのリンクは、解答で壊れています。フラッシングについては、[こちら](http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=session.add#flushing) –