Я не могу понять, как установить 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
к столбцу.
- Это столбец
sqlalchemy.types.Integer
, для которого создается объект sqlalchemy.schema.Sequence
в качестве аргумента.
- В MSSQL это добавляет свойство
INDEX(m,n)
к столбцу.
- В Postgres это приводит к использованию типа столбца
SERIAL
.
- В MySQL это игнорируется.
Так что я не могу использовать # 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)
)