sqlalchemy 和 postgresql 自动增量

2023-11-25

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

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

我希望看到序列的默认 nextval 的声明 但它不在那里。

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

我错过了什么吗?


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

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

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 隐式创建的行为相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlalchemy 和 postgresql 自动增量 的相关文章

随机推荐