Установка начального значения автоинкремента 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)
Итак, как я могу это получить? Спасибо заранее!
Ответы
Ответ 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;")
Будьте предупреждены, что если вы восстановите файлы миграции, это будет перезаписано.