52

自動インクリメントの主キーを使用してテーブルを作成した場合、実際にコミットせずに主キーが何であるかを取得する(つまり、主キーを予約するなどの操作を行う)方法はありますか?

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

4

2 に答える 2

89

あなたはする必要はありませんcommit、あなたはただする必要がありますflush。ここにいくつかのサンプルコードがあります。フラッシュの呼び出し後、割り当てられた主キーにアクセスできます。これはSQLAlchemyv1.3.6およびPython3.7.4であることに注意してください。

from sqlalchemy 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.add(user)
            session.flush()
            print('user_id', user.user_id)
            session.commit()
            session.close()

    unittest.main()
于 2009-03-06T23:10:07.430 に答える
-3

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

于 2009-03-06T22:57:00.253 に答える