2013-03-15 105 views
1

我創建了一個包含主鍵和序列的表格,但是通過稍後查看錶格設計的調試廣告,該序列未應用,剛剛創建。sqlalchemy和自動增量postgresql

from sqlalchemy import create_engine, MetaData, Table, Column,Integer,String,Boolean,Sequence 
from sqlalchemy.orm import mapper, sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 
import json 
class Bookmarks(object): 
    pass 

#---------------------------------------------------------------------- 
engine = create_engine('postgresql://iser:[email protected]/sconf', echo=True) 
Base = declarative_base() 

class Tramo(Base): 
    __tablename__ = 'tramos' 
    __mapper_args__ = {'column_prefix':'tramos'} 

    id = Column(Integer, Sequence('seq_tramos_id', start=1, increment=1),primary_key=True) 
    nombre = Column(String) 
    tramo_data = Column(String) 
    estado = Column(Boolean,default=True) 

    def __init__(self,nombre,tramo_data): 
     self.nombre=nombre 
     self.tramo_data=tramo_data 

    def __repr__(self): 
     return '[id:%d][nombre:%s][tramo:%s]' % self.id, self.nombre,self.tramo_data 

Session = sessionmaker(bind=engine) 
session = Session() 

tabla = Tramo.__table__ 
metadata = Base.metadata 
metadata.create_all(engine) 

表中剛剛創建這樣

CREATE TABLE tramos (
    id INTEGER NOT NULL, 
    nombre VARCHAR, 
    tramo_data VARCHAR, 
    estado BOOLEAN, 
    PRIMARY KEY (id) 
) 

我希望看到的序列 的默認nexval的declartion,但它不存在。

我也使用__mapper_args__但看起來它被忽略。

我錯過了什麼嗎?

回答

6

您指定了具有名稱的明確Sequence()對象。如果你忽略這一點,那麼SERIAL將被添加到id主鍵規格:

CREATE TABLE tramos (
    id INTEGER SERIAL NOT NULL, 
    nombre VARCHAR, 
    tramo_data VARCHAR, 
    estado BOOLEAN, 
    PRIMARY KEY (id) 
) 

如果列不是主鍵的DEFAULT,纔會產生。

插入時,SQLAlchemy將根據需要發出select nextval(..)以創建下一個值。詳情請參閱PostgreSQL documentation

+0

感謝現在我明白了,你知不知道爲什麼前綴信息被忽略的原因是什麼? – Freaktor 2013-03-15 18:52:31

3

我意識到這是一個古老的線程,但我偶然發現了同樣的問題,無法在其他地方找到解決方案。

經過一些試驗,我能夠用下面的代碼來解決這個問題:

TABLE_ID = Sequence('table_id_seq', start=1000) 

class Table(Base): 
    __tablename__ = 'table' 

    id = Column(Integer, TABLE_ID, primary_key=True, server_default=TABLE_ID.next_value()) 

這樣的順序被創建和彷彿隱式創建用作id列的默認值,具有相同的行爲通過SQLAlchemy。

0

我遇到了複合多列主鍵類似的問題。 SERIAL僅隱式應用於單列主鍵。然而,這種行爲可以通過autoincrement參數進行控制(默認爲"auto"):

id = Column(Integer, primary_key=True, autoincrement=True)