我有一个现有的SQL Server(2012)数据库,其中有许多表的主键为Numeric(9, 0)
类型。出于所有意图和目的,它们是整数。
ORM映射(使用sqlacodegen生成)如下所示:
class SomeTable(Base):
__tablename__ = 'SOME_TABLE'
__table_args__ = {'schema': 'dbo'}
SOME_TABLE_ID = Column(Numeric(9, 0), primary_key=True)
some_more_fields_here = XXX
插入数据的示例代码:
some_table = SomeTable(_not_specifying_SOME_TABLE_ID_explicityly_)
session.add(some_table)
session.flush() # <---BOOM, FlushError here
当我尝试将数据插入到这些表中时,我的应用程序在session.flush()崩溃时出现以下错误:
sqlalchemy.orm.exc.FlushError:Instance SomeTable ...具有NULL标识密钥。如果这是自动生成的值,请检查数据库表是否允许生成新的主键值,以及映射的Column对象是否配置为期望这些生成的值。还要确保此flush()没有在不适当的时间发生,例如在load()事件中。
如果我将Numeric
替换为BigInteger
,那么一切正常。我做了一些挖掘,使用Numeric
生成的查询是这样的:
INSERT INTO dbo.[SOME_TABLE] (_columns_without_SOME_TABLE_ID)
VALUES (...)
使用BigInteger生成的查询如下:
INSERT INTO dbo.[SOME_TABLE] (_columns_without_SOME_TABLE_ID)
OUTPUT inserted.[SOME_TABLE_ID]
VALUES (...)
我还发现了关于自动增量属性的peace of documentation。当然,它解释了我观察到的行为,即自动增量仅适用于整数。
所以我的问题是,是否有某种解决方法可以使autoincrement
使用数字列而不将它们转换为BigInteger
?
我的系统配置是 - Centos 7 64位,Python 3.5.2,Sqlalchemy 1.1.4,pymssql 2.2.0,SQL Server 2012.