2013-03-15 103 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)