SQLAlchemy получает первичный ключ с автоинкрементом перед фиксацией

Когда я создал таблицу с автоматически увеличивающимся первичным ключом, есть ли способ получить первичный ключ (то есть сделать что-то вроде резервирования первичного ключа) без фактической фиксации?

Я хотел бы разместить две операции внутри транзакции, однако одна из операций будет зависеть от того, какой первичный ключ был назначен в предыдущей операции.


person Community    schedule 06.03.2009    source источник


Ответы (2)


Вам не нужно commit, вам просто нужно flush. Вот пример кода. После вызова flush вы можете получить доступ к назначенному первичному ключу. Обратите внимание, что это с SQLAlchemy v1.3.6 и Python 3.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()
person Jacob Gabrielson    schedule 06.03.2009
comment
Из любопытства, в настоящее время это все еще так же беспорядочно в современной SQLAlchemy, v0.8.0? Или есть более простые способы? - person Mittenchops; 23.11.2012
comment
session.save сейчас session.add. - person Ilja Everilä; 30.06.2019

Вы можете использовать несколько транзакций и управлять ими в пределах области действия.

person achinda99    schedule 06.03.2009