Fre*_*tor 2 python postgresql sqlalchemy
我创建了一个包含主键和序列的表,但是稍后通过调试广告查看表设计时,序列不会被应用,只是创建了.
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)
Run Code Online (Sandbox Code Playgroud)
表就是这样创建的
CREATE TABLE tramos (
id INTEGER NOT NULL,
nombre VARCHAR,
tramo_data VARCHAR,
estado BOOLEAN,
PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
我希望看到序列的默认nexval的声明,但它不存在.
我也使用了__mapper_args__但看起来它被忽略了.
我错过了什么吗?
我遇到了与复合多列主键类似的问题。在SERIAL仅隐含地施加到单个列主键。但是,可以通过自动增量参数(默认为"auto")控制此行为:
id = Column(Integer, primary_key=True, autoincrement=True)
Run Code Online (Sandbox Code Playgroud)
您指定了Sequence()具有名称的显式对象.如果您要省略它,那么SERIAL将添加到id主键规范:
CREATE TABLE tramos (
id INTEGER SERIAL NOT NULL,
nombre VARCHAR,
tramo_data VARCHAR,
estado BOOLEAN,
PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)
DEFAULT仅当列不是主键时才会生成A.
插入时,SQLAlchemy将select nextval(..)根据需要发出一个以创建下一个值.有关详细信息,请参阅PostgreSQL文档.
小智 6
我意识到这是一个旧线程,但我偶然发现它有同样的问题,无法在其他任何地方找到解决方案.
经过一些实验,我能够用以下代码解决这个问题:
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())
Run Code Online (Sandbox Code Playgroud)
这样创建序列并将其用作列的默认值id,其行为与SQLAlchemy隐式创建的行为相同.
| 归档时间: |
|
| 查看次数: |
10135 次 |
| 最近记录: |