【发布时间】:2015-09-17 23:22:01
【问题描述】:
我正在使用 redshift-sqlalchemy 包将 SQLAlchemy 连接到 Redshift。在 Redshift 中,我有一个简单的“公司”表:
create table if not exists companies (
id bigint identity primary key,
name varchar(1024) not null
);
在 SQLAlchemy 方面,我已将其映射如下:
Base = declarative_base()
class Company(Base):
__tablename__ = 'companies'
id = Column(BigInteger, primary_key=True)
name = Column(String)
如果我尝试创建公司:
company = Company(name = 'Acme')
session.add(company)
session.commit()
然后我得到这个错误:
sqlalchemy.exc.StatementError: (raised as a result of Query-invoked autoflush;
consider using a session.no_autoflush block if this flush is occurring prematurely)
(sqlalchemy.exc.ProgrammingError) (psycopg2.ProgrammingError)
relation "companies_id_seq" does not exist
[SQL: 'select nextval(\'"companies_id_seq"\')']
[SQL: u'INSERT INTO companies (id, name)
VALUES (%(id)s, %(name)s)'] [parameters: [{'name': 'Acme'}]]
问题肯定是 SQLAlchemy 期望自动递增序列 - Postgres 和其他传统数据库的标准技术。但是 Redshift 没有序列,而是为自动生成的唯一值(不一定是连续的)提供“身份列”。关于如何使这项工作的任何建议?需要说明的是,我不关心自动递增,只需要唯一的主键值。
【问题讨论】:
-
此处的相关讨论:github.com/binarydud/redshift_sqlalchemy/issues/24 声称修复,但在我看来,这是对相关但不同的错误的修复,即创建表而不是通过 ORM 插入新条目,这是我担心的情况
标签: python sqlalchemy amazon-redshift