SQLAlchemy中的autoincrement
参数似乎只是True
和False
,但我想设置预定义值aid = 1001
,即自动增量{{1当下一次插入完成时。
在SQL中,可以像:
一样进行更改aid = 1002
我正在使用ALTER TABLE article AUTO_INCREMENT = 1001;
,我尝试过关注,但它不起作用:
MySQL
那么,我该怎么做呢?提前谢谢!
答案 0 :(得分:21)
您可以使用DDLEvents
来实现此目的。这将允许您在CREATE TABLE
运行后运行其他SQL语句。查看链接中的示例,但我猜您的代码将类似于以下内容:
from sqlalchemy import event
from sqlalchemy import DDL
event.listen(
Article.__table__,
"after_create",
DDL("ALTER TABLE %(table)s AUTO_INCREMENT = 1001;")
)
答案 1 :(得分:15)
根据the docs:
自动增量 - 此标志可以设置为False以指示不应被视为“自动增量”列的整数主键列,即整数主键列,它在INSERT时隐式生成值,其值通常通过DBAPI游标返回.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
,所以如果您是{{p}},请注意following。
Sequence对象还实现了特殊功能,以适应Postgresql的SERIAL数据类型。 PG中的SERIAL类型自动生成在插入期间隐式使用的序列。这意味着如果Table对象在其主键列上定义了一个Sequence,以便它可以与Oracle和Firebird一起使用,那么Sequence将会妨碍PG通常使用的“隐式”序列。对于此用例,将标志optional = True添加到Sequence对象 - 这表示只有在数据库不提供用于生成主键标识符的其他选项时才应使用Sequence。
答案 2 :(得分:2)
我无法使用mysql和flask-migrate获得其他工作的答案,所以我在迁移文件中执行了以下操作。
from app import db
db.engine.execute("ALTER TABLE myDB.myTable AUTO_INCREMENT = 2000;")
请注意,如果重新生成迁移文件,则会被覆盖。
答案 3 :(得分:0)
您可以使用 mysql_auto_increment
表创建选项来完成。还有 mysql_engine
和 mysql_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