2012-05-08 34 views
19

autoincrement論點SQLAlchemy的似乎只有TrueFalse,但我想設置預先定義的值aid = 1001,過自動增量aid = 1002下一次插入完成。設置SQLAlchemy的自動增量啓動值

在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) 

所以,我怎樣才能得到那?提前致謝!

回答

16

您可以通過使用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;") 
) 
+0

它的工作原理! 非常感謝。 – Gorthon

+1

有沒有辦法根據數據庫提供程序來排除此問題? ALTER ... AUTO_INCREMENT適用於MySQL(以及我認爲的大多數其他dbs),但是,SQL顯然不支持SQLITE。我能找到的最接近的解決方法是做一個插入/刪除:http://stackoverflow.com/questions/692856/set-start-value-for-autoincrement-in-sqlite – coderfi

+1

回答我自己的問題。通過代碼戳,我找到了解決辦法,這是由記錄:http://docs.sqlalchemy.org/en/rel_0_8/core/ddl.html#sqlalchemy.schema.DDLElement.execute_if 上述可改寫爲 event.listen( 第.__ table__, 「after_create」, DDL( 「ALTER TABLE%(表)■AUTO_INCREMENT = 1001;」)execute_if(方言=( '的PostgreSQL', 'MySQL的')) 。) 這讓我圍繞sqlite問題。 – coderfi

14

根據the docs

自動增量 - 該標誌可以被設置爲假以指示不應該被認爲是「自動增量」列的整數主鍵列,即整數主鍵該列在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與否,所以你應該記下following的如果你是:

Sequence對象還實現了特殊的功能來適應Postgresql的SERIAL數據類型。 PG中的SERIAL類型自動生成一個在插入過程中隱式使用的序列。這意味着如果一個Table對象在其主鍵列上定義了一個Sequence,以便它可以與Oracle和Firebird一起使用,那麼Sequence將阻礙PG通常使用的「隱式」序列。對於這種用例,將可選標誌= True添加到Sequence對象 - 這表示僅當數據庫不提供其他選項來生成主鍵標識符時才應使用Sequence。

+0

我正在使用MySQL。 根據文檔: 它只對具有顯式序列支持的數據庫有影響,目前 包含** Postgresql **,** Oracle **和** Firebird **。 我試過你的代碼,但它仍然不起作用。 – Gorthon

+0

啊,我的不好(只要我能看見,我就用PG)。在這種情況下,我會在@ van的答案上面寫上一個高峯! – Edwardr

+0

對不起我的英文不好(我不知道'我的壞'的意思和'在'高峯') 事實上,@範的答案比你的晚。 非常感謝! – Gorthon

1

我不能讓其他答案用mysql和工作燒瓶遷移,所以我做內以下遷移文件。

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

被警告,如果您重新生成遷移文件,則會覆蓋此文件。