2009-03-06 4 views
34

自動インクリメントのプライマリキーを使用してテーブルを作成した場合、プライマリキーを取得する方法(プライマリキーを予約する)実際にコミットしていますか?SQLAlchemyコミット前の自動インクリメントによるプライマリキーの取得

トランザクション内に2つの操作を配置したいのですが、操作の1つは前の操作で割り当てられた主キーに依存します。

答えて

0

複数のトランザクションを使用して、範囲内で管理することができます。

72

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

いいコード例のために心のこもった+1! –

+0

好奇心の高まりから、これは現代のSQLAlchemy v0.8.0ではまだまだ乱雑ですか?それとも簡単な方法がありますか? – Mittenchops

+0

** flush **へのリンクは、解答で壊れています。フラッシングについては、[こちら](http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html?highlight=session.add#flushing) –

関連する問題