Набор использование AUTO_INCREMENT SqlAlchemy с MySQL на Столбцах с непервичными ключами?

Я не могу выяснить, как установить 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) свойство к столбцу.
    • С Пост-ГРЭС это вызывает SERIAL тип столбца, который будет использоваться.
    • С MySQL добавляет AUTO_INCREMENT свойство к столбцу.
  2. Это sqlalchemy.types.Integer столбец, и инстанцируют с sqlalchemy.schema.Sequence возразите как аргумент.
    • С MSSQL это добавляет INDEX(m,n) свойство к столбцу.
    • С Пост-ГРЭС это вызывает 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)
)
17
задан Tom Willis 23 April 2012 в 23:15
поделиться

1 ответ

Возможно, вас заинтересует Мне нужно автоинкрементировать поле в MySQL это не первичный ключ

. Я не знаком с sqlalchemy, но знаю, что это можно сделать в MySQL. Сначала необходимо определить столбец id как ПЕРВИЧНЫЙ КЛЮЧ и установить его AUTO_INCREMENT . Затем вы можете ИЗМЕНИТЬ ТАБЛИЦУ и УДАЛИТЬ ПЕРВИЧНЫЙ КЛЮЧ , заменив его на ДОБАВИТЬ УНИКАЛЬНЫЙ КЛЮЧ . Это сохранит функциональность AUTO_INCREMENT в этом столбце. Затем вы можете создать ПЕРВИЧНЫЙ КЛЮЧ в других столбцах.

Чтобы разбить его, ваш первый шаг - создать таблицу следующим образом:

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);

Наконец, добавьте свой ПЕРВИЧНЫЙ КЛЮЧ в другие столбцы:

ALTER TABLE person ADD PRIMARY KEY(first_name, last_name);
5
ответ дан 30 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: