tipo - ¿Configurar AUTO_INCREMENT usando SqlAlchemy con MySQL en columnas con claves no primarias?
insertar columna auto_increment mysql (2)
No puedo averiguar cómo configurar AUTO_INCREMENT en una columna ÚNICA usando SqlAlchemy 0.6.0 con MySQL 5.
Sé que esto se puede hacer en MySQL, pero no quiero tener que distribuir scripts .sql adicionales para configurar las bases de datos para mi aplicación. Quiero que SqlAlchemy construya el esquema desde Python.
Por lo que he encontrado hasta ahora, hay dos maneras en que una columna puede convertirse en una columna de tipo auto-incremental en SqlAlchemy:
- Es la primera columna
sqlalchemy.types.Integeren la tabla que tieneprimary_key=Truey no tieneautoincrement=Falseestablecido en su definición.- Con MSSQL esto agrega una propiedad
INDEX(m,n)a la columna. - Con Postgres esto hace que se use el tipo de columna
SERIAL. - Con MySQL agrega la propiedad
AUTO_INCREMENTa la columna.
- Con MSSQL esto agrega una propiedad
- Es una columna
sqlalchemy.types.Integer, y se crea una instancia con un objetosqlalchemy.schema.Sequencecomo argumento.- Con MSSQL esto agrega una propiedad
INDEX(m,n)a la columna. - Con Postgres esto hace que se use el tipo de columna
SERIAL. - Con MySQL esto parece ser ignorado.
- Con MSSQL esto agrega una propiedad
Por lo tanto, no puedo usar el # 1 porque la columna que quiero que auto_increment no esté en la clave principal (ni debería estar). Y no puedo usar el # 2 porque no funciona con MySQL.
Básicamente, mi código para definir la tabla tiene el siguiente aspecto:
from sqlalchemy import Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Sequence
from sqlalchemy.types import Integer, Unicode
Base = declarative_base()
class Person(Base):
__tablename__ = "person"
id = Column(Integer, nullable=False, unique=True)
first_name = Column(Unicode(100), nullable=False, primary_key=True)
last_name = Column(Unicode(100), nullable=False, primary_key=True)
Y produce este SQL para crear la tabla:
CREATE TABLE person (
id INTEGER NOT NULL,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
PRIMARY KEY (first_name, last_name),
UNIQUE (id)
)
¿Qué puedo hacer para que produzca el siguiente SQL?
CREATE TABLE person (
id INTEGER NOT NULL AUTO_INCREMENT,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
PRIMARY KEY (first_name, last_name),
UNIQUE (id)
)
Extracto de http://www.mail-archive.com/[email protected]/msg19744.html
Su mejor apuesta por ahora es emitir una
ALTER TABLEque aplique elAUTO_INCREMENT, si MySQL lo admite.
from sqlalchemy.schema import DDL
DDL("ALTER TABLE person ...", on=''mysql'').execute_at(''after-create'',
person_table)[..]
Quizás te interese . Necesito autoincrementar un campo en MySQL que no sea la clave principal.
No estoy familiarizado con sqlalchemy, pero sí sé que esto se puede lograr en MySQL. Primero debe definir la columna de id como la PRIMARY KEY y establecerla AUTO_INCREMENT . Luego puede ALTER TABLE DROP PRIMARY KEY ALTER TABLE y DROP PRIMARY KEY , reemplazándola con la ADD UNIQUE KEY . Esto mantendrá la funcionalidad AUTO_INCREMENT en esa columna. A continuación, puede crear la PRIMARY KEY en las otras columnas.
Para descomponerlo, su primer paso es crear la tabla de esta manera:
CREATE TABLE person (
id INTEGER NOT NULL AUTO_INCREMENT,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
A continuación modifique la clave de id :
ALTER TABLE person DROP PRIMARY KEY, ADD UNIQUE KEY(id);
Finalmente, agregue su PRIMARY KEY en las otras columnas:
ALTER TABLE person ADD PRIMARY KEY(first_name, last_name);