Почему SQLAlchemy не создает последовательные столбцы?

SQLAlchemy генерирует, но не разрешает, последовательности для столбцов в postgresql. Я подозреваю, что я могу сделать что-то неправильно в настройке двигателя.

Используя пример из учебника SQLAlchemy ( http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html ):

#!/usr/bin/env python from sqlalchemy import create_engine, Column, Integer, String, Sequence from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, Sequence('user_id_seq'), primary_key=True) name = Column(String(50)) fullname = Column(String(50)) password = Column(String(12)) def __repr__(self): return "<User(name='%s', fullname='%s', password='%s')>" % ( self.name, self.fullname, self.password) db_url = 'postgresql://localhost/serial' engine = create_engine(db_url, echo=True) Base.metadata.create_all(engine) 

С помощью этого сценария создается следующая таблица:

 serial=# \d+ users Table "public.users" Column | Type | Modifiers | Storage | Stats target | Description ----------+-----------------------+-----------+----------+--------------+------------- id | integer | not null | plain | | name | character varying(50) | | extended | | fullname | character varying(50) | | extended | | password | character varying(12) | | extended | | Indexes: "users_pkey" PRIMARY KEY, btree (id) Has OIDs: no 

Однако была создана последовательность:

 serial=# select sequence_schema,sequence_name,data_type from information_schema.sequences ; sequence_schema | sequence_name | data_type -----------------+---------------+----------- public | user_id_seq | bigint 

SQLAlchemy 0.9.1, Python 2.7.5+, Postgresql 9.3.1, Ubuntu 13.10

-Reece

это потому, что вы предоставили ему явную Sequence . Тип данных SERIAL в postgresql генерирует свою собственную последовательность, которую SQLAlchemy знает, как найти – поэтому, если вы опустите Sequence , SQLAlchemy будет выдавать SERIAL , предполагая, что цель состоит в том, что столбец автоматически увеличивается (что определяется аргументом autoincrement в сочетании с Integer primary_key, по умолчанию – True). Но когда Sequence передается, SQLAlchemy видит намерение, что вам не нужна последовательность, неявно созданная SERIAL но вместо той, которую вы указываете:

 from sqlalchemy import create_engine, Column, Integer, String, Sequence from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class T1(Base): __tablename__ = 't1' # emits CREATE SEQUENCE + INTEGER id = Column(Integer, Sequence('user_id_seq'), primary_key=True) class T2(Base): __tablename__ = 't2' # emits SERIAL id = Column(Integer, primary_key=True) class T3(Base): __tablename__ = 't3' # emits INTEGER id = Column(Integer, autoincrement=False, primary_key=True) engine = create_engine("postgresql://scott:tiger@localhost/test", echo=True) Base.metadata.create_all(engine) 

вывод:

 CREATE SEQUENCE user_id_seq CREATE TABLE t1 ( id INTEGER NOT NULL, PRIMARY KEY (id) ) CREATE TABLE t2 ( id SERIAL NOT NULL, PRIMARY KEY (id) ) CREATE TABLE t3 ( id INTEGER NOT NULL, PRIMARY KEY (id) )