Установить AUTO_INCREMENT, используя SqlAlchemy с MySQL для столбцов с неосновными ключами? - PullRequest
17 голосов
/ 30 мая 2010

Я не могу понять, как установить AUTO_INCREMENT для столбца UNIQUE, используя SqlAlchemy 0.6.0 с MySQL 5.

Я знаю, что это можно сделать в MySQL, но я не хочу распространять дополнительные сценарии .sql, чтобы настроить базы данных для моего приложения. Я хочу, чтобы SqlAlchemy строил схему из Python.

Насколько я обнаружил, есть два способа, которыми столбец может стать столбцом автоинкрементного типа в SqlAlchemy:

  1. Это первый столбец sqlalchemy.types.Integer в таблице, который имеет primary_key=True и в его определении не установлено autoincrement=False.
    • В MSSQL это добавляет свойство INDEX(m,n) к столбцу.
    • В Postgres это приводит к использованию типа столбца SERIAL.
    • С MySQL добавляет свойство AUTO_INCREMENT к столбцу.
  2. Это столбец 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)
)

Ответы [ 2 ]

5 голосов
/ 31 мая 2010

Вас может заинтересовать Мне нужно auto_increment поле в 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);
4 голосов
/ 23 марта 2011

Выдержка из http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg19744.html

Лучше всего на данный момент выдать ALTER TABLE, который применяет AUTO_INCREMENT, если MySQL поддерживает это.

from sqlalchemy.schema import DDL
DDL("ALTER TABLE person ...", on='mysql').execute_at('after-create', 
    person_table)[..]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...