SQLAlchemy 在提交前使用自动增量获取主键 [英] SQLAlchemy Obtain Primary Key With Autoincrement Before Commit

查看:27
本文介绍了SQLAlchemy 在提交前使用自动增量获取主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我创建了一个带有自动递增主键的表时,有没有办法在不实际提交的情况下获取主键(即,执行诸如保留主键之类的操作)?

When I have created a table with an auto-incrementing primary key, is there a way to obtain what the primary key would be (that is, do something like reserve the primary key) without actually committing?

我想在一个事务中放置两个操作,但是其中一个操作将取决于在前一个操作中分配的主键.

I would like to place two operations inside a transaction however one of the operations will depend on what primary key was assigned in the previous operation.

推荐答案

你不需要commit,你只需要flush.这是一些示例代码.在调用 flush 之后您可以访问分配的主键.请注意,这是使用 SQLAlchemy v1.3.6 和 Python 3.7.4.

You don't need to commit, you just need to flush. Here's some sample code. After the call to flush you can access the primary key that was assigned. Note this is with SQLAlchemy v1.3.6 and 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()

这篇关于SQLAlchemy 在提交前使用自动增量获取主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆