30

SQLAlchemy 中的autoincrement参数似乎只有Trueand 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)

那么,我怎样才能得到呢?提前致谢!

4

5 回答 5

24

您可以通过使用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;")
)
于 2012-05-08T14:03:10.793 回答
20

根据文档

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 对象还实现了特殊功能以适应 Postgresql 的 SERIAL 数据类型。PG 中的 SERIAL 类型会自动生成一个在插入过程中隐式使用的序列。这意味着如果一个 Table 对象在其主键列上定义了一个序列,以便它与 Oracle 和 Firebird 一起工作,那么该序列将妨碍 PG 通常使用的“隐式”序列。对于这个用例,将标志 optional=True 添加到 Sequence 对象 - 这表明只有在数据库没有提供其他选项来生成主键标识符时才应该使用 Sequence。

于 2012-05-08T08:51:16.090 回答
2

我无法使用 mysql 和 flask-migrate 获得其他答案,因此我在迁移文件中执行了以下操作。

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

请注意,如果您重新生成迁移文件,这将被覆盖。

于 2014-05-15T18:37:01.897 回答
2

我知道这是一个老问题,但我最近不得不弄清楚这一点,并且没有一个可用的答案是我所需要的。我发现的解决方案依赖SequenceSQLAlchemy。无论出于何种原因,当我在上面提到Sequence的构造函数中调用构造函数时,我无法让它工作。Column作为说明,我使用的是 PostgreSQL。

对于您的回答,我会这样说:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Sequence, Column, Integer

import os
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Sequence, Integer, create_engine
Base = declarative_base()

def connection():
    engine = create_engine(f"postgresql://postgres:{os.getenv('PGPASSWORD')}@localhost:{os.getenv('PGPORT')}/test")
    return engine

engine = connection()

class Article(Base):
    __tablename__ = 'article'
    seq = Sequence('article_aid_seq', start=1001)
    aid = Column('aid', Integer, seq, server_default=seq.next_value(), primary_key=True)

Base.metadata.create_all(engine)

然后可以在 PostgreSQL 中调用:

insert into article (aid) values (DEFAULT);
select * from article;

 aid  
------
 1001
(1 row)

希望这对某人有所帮助,因为我花了一段时间

于 2021-09-23T14:47:16.403 回答
0

您可以使用mysql_auto_incrementtable create 选项来完成。也有mysql_enginemysql_default_charset选项,这可能也很方便:

article = Table(
    'article', metadata,
    Column('aid', INTEGER(unsigned=True, zerofill=True), primary_key=True),
    mysql_engine='InnoDB',
    mysql_default_charset='utf8',
    mysql_auto_increment='1001',
)

以上将生成:

CREATE TABLE article (
    aid INTEGER UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (aid)
)ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
于 2021-02-26T01:15:50.143 回答