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

Аргумент autoincrement в SQLAlchemy кажется только True и False , но я хочу установить предопределенное значение aid = 1001 , via autoincrement 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) 

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

  • Использование OR в SQLAlchemy
  • Как отправить результаты запроса в поле WTForm?
  • Значение по умолчанию для столбца сохраняется в таблице
  • Как установить тайм-аут для выполнения запроса
  • SQLAlchemy ON DUPLICATE KEY UPDATE
  • Результаты двойного счета Postgres + Sqlalchemy
  • Pythonic способ правильно отделить модель от приложения с помощью SQLAlchemy
  • Как правильно отключить кеширование в сеансе ORM Sqlalchemy?
  • 3 Solutions collect form web for “Установка начального значения автоинкремента SQLAlchemy”

    Вы можете добиться этого, используя 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;") ) 

    Согласно документам :

    autoincrement. Этот флаг может быть установлен в False, чтобы указать целочисленный столбец первичного ключа, который не следует рассматривать как столбец «автоинкремент», который является столбцом целочисленного первичного ключа, который неявно генерирует значения INSERT и значение которого обычно возвращается через DBAPI cursor.lastrowid. По умолчанию 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 также реализует специальные функции для размещения SERIAL-типа данных Postgresql. Тип SERIAL в PG автоматически генерирует последовательность, которая используется неявно во время вставок. Это означает, что если объект таблицы определяет последовательность в своем столбце первичного ключа, так что он работает с Oracle и Firebird, последовательность будет мешать «неявной» последовательности, которую обычно использует PG. Для этого варианта использования добавьте флаг optional = True в объект Sequence – это означает, что последовательность должна использоваться только в том случае, если в базе данных нет другой опции для генерации идентификаторов первичного ключа.

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

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

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

    Python - лучший язык программирования в мире.