【发布时间】:2019-08-31 18:21:19
【问题描述】:
我有一个带有自动递增主键的 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)
这是一个插入示例:
t = Tub(id=20, tare_weight=200)
session.add(t)
session.commit()
这是生成的 SQL:
BEGIN
SET IDENTITY_INSERT [Tub] ON
INSERT INTO [Tub] ([ID], [TareWeight]) VALUES (20, 200)
SET IDENTITY_INSERT [Tub] OFF
COMMIT
更新:
我意识到的另一个相关情况是:
t = Tub(id=20, tare_weight=200)
session.merge(t)
session.commit()
如果 tub 已经存在于数据库中,我希望更新它的权重。如果没有,我希望插入失败,因为它包含显式主键。
【问题讨论】:
标签: python sql-server sqlalchemy