7

我创建了一个带有主键和序列的表,但是通过调试广告稍后查看表设计,没有应用序列,只是创建了。

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:p@host/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 的声明,但它不存在。

我也使用了,__mapper_args__但看起来它被忽略了。

我错过了什么吗?

4

3 回答 3

9

我意识到这是一个旧线程,但我偶然发现了同样的问题并且无法在其他任何地方找到解决方案。

经过一些试验,我能够用以下代码解决这个问题:

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

这样,序列被创建并用作 column 的默认值id,其行为与 SQLAlchemy 隐式创建的行为相同。

于 2015-06-22T20:05:14.567 回答
9

我遇到了复合多列主键的类似问题。SERIAL仅隐式应用于单列主键。但是,可以通过autoincrement参数(默认为"auto")控制此行为:

id = Column(Integer, primary_key=True, autoincrement=True)
于 2017-01-22T20:21:52.617 回答
8

您指定了一个Sequence()带有名称的显式对象。如果您要省略它,则将SERIAL添加到id主键规范中:

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

DEFAULT仅当列不是主键时才会生成A。

插入时,SQLAlchemy 将select nextval(..)根据需要发出 a 以创建下一个值。有关详细信息,请参阅PostgreSQL 文档

于 2013-03-15T18:38:06.907 回答