usar tipo primaria llave insertar hacer funciona dato crear como columna clave campo autoincremental auto_increment mysql sqlalchemy auto-increment

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:

  1. Es la primera columna sqlalchemy.types.Integer en la tabla que tiene primary_key=True y no tiene autoincrement=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.
  2. Es una columna sqlalchemy.types.Integer , y se crea una instancia con un objeto sqlalchemy.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.

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 el AUTO_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);