使用Sqlalchemy和SQL Server强制在Numeric主键上自动增量

时间:2016-12-08 22:39:38

标签: python sql-server sqlalchemy pymssql

我有一个现有的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 (...)
  • 从SQL的角度来看似乎是一个有效的查询,但是Sqlalchemy在那里引发了上述异常

使用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.

0 个答案:

没有答案