Установить AUTO_INCREMENT с помощью SqlAlchemy с MySQL на столбцах с непервичными ключами?
Я не могу понять, как установить 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)
)
Ответы
Ответ 1
Вам может быть интересно Мне нужно автоматически указывать в MySQL поле, не являющееся первичным ключом
Я не знаком с sqlalchemy, но я знаю, что это может быть выполнено в MySQL. Сначала вы должны определить столбец id
как PRIMARY KEY
и установить его AUTO_INCREMENT
. Затем вы можете ALTER TABLE
и DROP PRIMARY KEY
, заменив его на ADD UNIQUE KEY
. Это сохранит функциональность AUTO_INCREMENT
в этом столбце. Затем вы можете создать PRIMARY KEY
в других столбцах.
Чтобы разбить его, первым шагом будет создание таблицы:
CREATE TABLE person (
id INTEGER NOT NULL AUTO_INCREMENT,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
Далее измените ключ id
:
ALTER TABLE person DROP PRIMARY KEY, ADD UNIQUE KEY(id);
Наконец, добавьте ваш PRIMARY KEY
в другие столбцы:
ALTER TABLE person ADD PRIMARY KEY(first_name, last_name);
Ответ 2
Выдержка из http://www.mail-archive.com/[email protected]/msg19744.html
Лучше всего на данный момент выдать ALTER TABLE
, который применяет AUTO_INCREMENT
, если MySQL поддерживает это.
from sqlalchemy.schema import DDL
DDL("ALTER TABLE person ...", on='mysql').execute_at('after-create',
person_table)[..]