设置SQLAlchemy自动增量的起始值

Gor*_*hon 24 python sqlalchemy auto-increment

autoincrement在SQLAlchemy的说法似乎是唯一的TrueFalse,但我想设置预先定义的值aid = 1001时,通过自动增量aid = 1002时,下一个插入完成.

在SQL中,可以更改为:

ALTER TABLE article AUTO_INCREMENT = 1001;
Run Code Online (Sandbox Code Playgroud)

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

那么,我该怎么做呢?提前致谢!

van*_*van 23

你可以通过使用来实现这一点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;")
)
Run Code Online (Sandbox Code Playgroud)


Edw*_*rdr 16

根据文件:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,我不知道您是否正在使用PostgreSQL,因此如果您符合以下条件,则应注意以下事项:

Sequence对象还实现了特殊功能,以适应Postgresql的SERIAL数据类型.PG中的SERIAL类型自动生成在插入期间隐式使用的序列.这意味着如果Table对象在其主键列上定义了一个Sequence,以便它可以与Oracle和Firebird一起使用,那么Sequence将会妨碍PG通常使用的"隐式"序列.对于此用例,将标志optional = True添加到Sequence对象 - 这表示只有在数据库不提供用于生成主键标识符的其他选项时才应使用Sequence.

  • 我不仅可以在这里学习Python,还可以学习英语,呵呵. (15认同)