2010-03-03 13 views
7

Ben sqlalchemy 6.0 kullanıyorum. SQL Server T-SQL lehçesi, birincil anahtarımın bir parçası olan bir tamsayıyı bir kimliğe dönüştürmek istiyor gibi görünüyor. Tamsayı alanı birincil anahtar olsaydı tamam olabilir, ama benimki bir kompozit ve bu benim için çalışmayacak. Bu davranışı bastırmak için bir yolu var mı?sqlalchemy bir IDENTITY tür yapmadan bir tamsayı parçası ile bir bileşik birincil anahtar oluşturmak mümkün mü?

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

Sonuçlar::

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

cevap

10

ben aynı sorundan ısırmış

İşte sorunun bir gösteri bu. Solüsyon int birincil anahtar sütun kurucusuna Yanlış AUTOINCREMENT = eklemektir:

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

Aksi takdirde, sqlalchemy buna bir kimlik sütunu yapmalıdır varsayar.

İlgili konular