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.Integer
en la tabla que tieneprimary_key=True
y no tieneautoincrement=False
establecido 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_INCREMENT
a la columna.
- Con MSSQL esto agrega una propiedad
- Es una columna
sqlalchemy.types.Integer
, y se crea una instancia con un objetosqlalchemy.schema.Sequence
como 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 TABLE
que 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);