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

Установка начального значения автоинкремента SQLAlchemy

Аргумент autoincrement в SQLAlchemy кажется только True и False, но я хочу установить предварительно определенное значение aid = 1001, автоинкремент через aid = 1002, когда будет выполнена следующая вставка.

В SQL можно изменить как:

ALTER TABLE article AUTO_INCREMENT = 1001;

Я использую MySQL, и я пробовал следовать, но он не работает:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Article(Base):
    __tablename__ = 'article'
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
                autoincrement=1001, primary_key=True)

Итак, как я могу это получить? Спасибо заранее!

4b9b3361

Ответ 1

Вы можете достичь этого, используя DDLEvents. Это позволит вам запускать дополнительные инструкции SQL сразу после запуска CREATE TABLE. Посмотрите примеры в ссылке, но я предполагаю, что ваш код будет выглядеть примерно так:

from sqlalchemy import event
from sqlalchemy import DDL
event.listen(
    Article.__table__,
    "after_create",
    DDL("ALTER TABLE %(table)s AUTO_INCREMENT = 1001;")
)

Ответ 2

В соответствии с документами:

автоинкремент - Этот флаг может быть установлен в False для указания целочисленного столбца первичного ключа, который не должен считаться столбцом "автоинкремент", который является столбцом целых первичных ключей, который неявно генерирует значения INSERT и значение которого обычно возвращается с помощью курсора DBAPI.областной атрибут. По умолчанию True используется для удовлетворения общего использования таблицы с одним целым столбцом первичного ключа.

Итак, autoincrement - это только флаг, позволяющий SQLAlchemy знать, является ли это основным ключом, который вы хотите увеличить.

То, что вы пытаетесь сделать, - создать пользовательскую последовательность автоинкремента.

Итак, ваш пример, я думаю, должен выглядеть примерно так:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Sequence

Base = declarative_base()

class Article(Base):
    __tablename__ = 'article'
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
                 Sequence('article_aid_seq', start=1001, increment=1),   
                 primary_key=True)

Заметьте, я не знаю, используете ли вы PostgreSQL или нет, поэтому вам следует обратить внимание на ниже, если вы:

Объект Sequence также реализует специальные функции для размещения типа данных Postgresqls SERIAL. Тип SERIAL в PG автоматически генерирует последовательность, которая используется неявно во время вставок. Это означает, что если объект таблицы определяет последовательность в своем столбце первичного ключа, так что он работает с Oracle и Firebird, последовательность будет мешать "неявной" последовательности, которую обычно использует PG. Для этого варианта использования добавьте флаг optional = True в объект Sequence - это означает, что последовательность должна использоваться только в том случае, если в базе данных нет другой опции для генерации идентификаторов первичного ключа.

Ответ 3

Я не мог заставить другие ответы работать с использованием mysql и flask-migrate, поэтому я сделал следующее в файле миграции.

from app import db
db.engine.execute("ALTER TABLE myDB.myTable AUTO_INCREMENT = 2000;")

Будьте предупреждены, что если вы восстановите файлы миграции, это будет перезаписано.