Я не могу понять, как установить AUTO_INCREMENT в столбце UNIQUE, используя SqlAlchemy 0.6.0 с MySQL 5.
Я знаю, что это можно сделать в MySQL, но я не хочу распространять дополнительные .sql-скрипты, чтобы настроить базы данных для моего приложения. Я хочу, чтобы SqlAlchemy построил схему из Python.
Насколько я нашел до сих пор, существует два способа, которыми столбец может стать столбцом с автоинкрементным типом в SqlAlchemy:
- Это первый столбец
sqlalchemy.types.Integer
в таблице, который имеетprimary_key=True
и не имеетautoincrement=False
, заданного в его определении.- В MSSQL это добавляет свойство
INDEX(m,n)
в столбец. - В Postgres это приводит к использованию типа столбца
SERIAL
. - С MySQL добавляет свойство
AUTO_INCREMENT
в столбец.
- В MSSQL это добавляет свойство
- Это столбец
sqlalchemy.types.Integer
и создается как объектsqlalchemy.schema.Sequence
в качестве аргумента.- В MSSQL это добавляет свойство
INDEX(m,n)
в столбец. - В Postgres это приводит к использованию типа столбца
SERIAL
. - С MySQL это кажется проигнорированным.
- В MSSQL это добавляет свойство
Поэтому я не могу использовать # 1, потому что столбец, который я хочу для auto_increment, не входит в первичный ключ (и не должен). И я не могу использовать # 2, потому что он не работает с MySQL.
В принципе, мой код для определения таблицы выглядит следующим образом:
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)
И создает этот SQL для создания таблицы:
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)
)
Что я могу сделать, чтобы заставить его создать следующий 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)
)