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

このようにして、シーケンスが作成され、列のデフォルト値として使用されます。これ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)
)

ADEFAULTは、列が主キーでない場合にのみ生成されます。

挿入するとき、SQLAlchemyはselect nextval(..)次の値を作成するために必要に応じてを発行します。詳細については、PostgreSQLのドキュメントを参照してください。

于 2013-03-15T18:38:06.907 に答える