python - support - ¿Es posible obtener sqlalchemy para crear una clave primaria compuesta con una parte entera sin convertirla en un tipo de IDENTIDAD?
sqlalchemy oracle (1)
Me siento un poco afectado por el mismo problema. La solución es agregar autoincrement = False al constructor de la columna clave principal int:
Column(u''int_part'', Integer, primary_key=True, nullable=False,
autoincrement=False)
De lo contrario, sqlalchemy supone que debería convertirse en una columna de identidad.
Estoy usando sqlalchemy 6.0. El dialecto T-SQL de SQL Server parece querer convertir cualquier entero que sea parte de mi clave principal en una identidad. Eso puede estar bien si el campo entero fuera la clave principal, pero el mío es un compuesto y esto no va a funcionar para mí. ¿Hay alguna manera de suprimir este comportamiento?
Aquí hay una demostración del problema:
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())
Resultados:
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)
)