在SQLAlchemy

时间:2015-07-01 00:04:42

标签: python sqlalchemy amazon-redshift

我正在使用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和其他传统DB的标准技术。但Redshift没有序列,而是为自动生成的唯一值(不一定是顺序)提供“标识列”。有关如何使这项工作的任何建议?要清楚,我不关心自动递增,只需要唯一的主键值。

1 个答案:

答案 0 :(得分:2)

就像你说的那样,Redshift不支持序列,所以你可以删除这部分:

select nextval(\'"companies_id_seq"\')

你的插入语句应该只是:

INSERT INTO companies 
(name)
VALUES
('Acme')

在您的表格中,您会看到' Acme'有一个具有唯一值的id列。您无法在id列中插入值,因此您不必在insert语句中指定它。它将自动填充。

以下是更多解释:

http://docs.aws.amazon.com/redshift/latest/dg/c_Examples_of_INSERT_30.html