Подтвердить что ты не робот

Установить 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)
)
4b9b3361

Ответ 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)[..]