防止 SQLAlchemy 自动设置 IDENTITY_INSERT

Mar*_*ese 2 python sql-server sqlalchemy

我有一个带有自动递增主键的 SQL Server 表,我正在使用 SQLAlchemy 对其进行操作。如果我创建包含主键的该表模型的实例,而不是将其保留并调用session.add(instance),SQLAlchemy 会自动SET IDENTITY_INSERT [table] ON向数据库发出消息并且插入会成功。

有没有办法自己控制这个?如果我尝试插入特定的主键而不是让它自动递增,我宁愿收到错误。如果我确实需要设置主键,我宁愿必须明确地告诉它。

这是模型:

Base = declarative_base()

class Tub(Base):
    __tablename__ = 'Tub'

    id = Column('ID', Integer, primary_key=True, autoincrement=True)
    tare_weight = Column('TareWeight', Float(53), nullable=False)
Run Code Online (Sandbox Code Playgroud)

这是一个插入示例:

t = Tub(id=20, tare_weight=200)
session.add(t)
session.commit()
Run Code Online (Sandbox Code Playgroud)

下面是生成的 SQL:

BEGIN
SET IDENTITY_INSERT [Tub] ON
INSERT INTO [Tub] ([ID], [TareWeight]) VALUES (20, 200)
SET IDENTITY_INSERT [Tub] OFF
COMMIT
Run Code Online (Sandbox Code Playgroud)

更新:

我意识到的另一个相关情况是这样的:

t = Tub(id=20, tare_weight=200)
session.merge(t)
session.commit()
Run Code Online (Sandbox Code Playgroud)

如果数据库中已存在浴缸,我希望更新其重量。如果没有,我希望插入失败,因为它包含显式主键。

Alw*_*ing 7

根据SQLAlchemy 1.3 文档

IDENTITY对于不需要默认生成的情况,请在第一个整数主键列上指定标志FalseColumn.autoincrement

m = MetaData()
t = Table('t', m,
        Column('id', Integer, primary_key=True, autoincrement=False),
        Column('x', Integer))
m.create_all(engine)
Run Code Online (Sandbox Code Playgroud)