Можно ли заставить sqlalchemy создать составной первичный ключ с целочисленной частью, не делая его типом IDENTITY? - PullRequest
9 голосов
/ 03 марта 2010

Я использую sqlalchemy 6.0. Диалект T-SQL в SQL Server, похоже, хочет превратить любое целое число, которое является частью моего первичного ключа, в тождество. Это может быть хорошо, если целочисленное поле было первичным ключом, но мое является составным, и это не будет работать для меня. Есть ли способ подавить это поведение?

Вот демонстрация проблемы:

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)
)

1 Ответ

12 голосов
/ 01 мая 2010

Я столкнулся с той же проблемой. Решением является добавление autoincrement = False в конструктор столбца первичного ключа int:

Column(u'int_part', Integer, primary_key=True, nullable=False,
       autoincrement=False)

В противном случае sqlalchemy предполагает, что он должен сделать его столбцом идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...