我正在使用sqlalchemy 6.0。 SQL Server T-SQL方言似乎想要将属于我主键的任何整数转换为标识。如果整数字段是主键,那可能没问题,但我的是一个复合词,这对我不起作用。有没有办法抑制这种行为?
以下是问题的演示:
from sqlalchemy import *
from sqlalchemy.schema import CreateTable
from sqlalchemy.types import CHAR
import sqlalchemy.dialects.mssql.pyodbc
metadata = MetaData()
t = Table('TEST', metadata,
Column(u'int_part', Integer, primary_key=True, nullable=False),
Column(u'char_part', CHAR(length=20), primary_key=True, nullable=False),
)
create = CreateTable(t)
print "Generic dialect gets it right"
print create.compile()
print
print "MSSql dialect gets it wrong"
print create.compile(dialect=sqlalchemy.dialects.mssql.pyodbc.dialect())
结果:
Generic dialect gets it right
CREATE TABLE "TEST" (
int_part INTEGER NOT NULL,
char_part CHAR(20) NOT NULL,
PRIMARY KEY (int_part, char_part)
)
SQL Server T-SQL dialect gets it wrong
CREATE TABLE [TEST] (
int_part INTEGER NOT NULL IDENTITY(1,1),
char_part CHAR(20) NOT NULL,
PRIMARY KEY (int_part, char_part)
)
答案 0 :(得分:12)
我有点同样的问题。解决方案是将autoincrement = False添加到int主键列构造函数中:
Column(u'int_part', Integer, primary_key=True, nullable=False,
autoincrement=False)
否则,sqlalchemy假定它应该使它成为一个标识列。