Wal*_*ett 15 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
);
Run Code Online (Sandbox Code Playgroud)
在SQLAlchemy方面,我已将其映射为:
Base = declarative_base()
class Company(Base):
__tablename__ = 'companies'
id = Column(BigInteger, primary_key=True)
name = Column(String)
Run Code Online (Sandbox Code Playgroud)
如果我尝试创建公司:
company = Company(name = 'Acme')
session.add(company)
session.commit()
Run Code Online (Sandbox Code Playgroud)
然后我收到这个错误:
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'}]]
Run Code Online (Sandbox Code Playgroud)
问题肯定是SQLAlchemy期望一个自动递增序列 - Postgres和其他传统DB的标准技术.但Redshift没有序列,而是为自动生成的唯一值(不一定是顺序)提供"标识列".有关如何使这项工作的任何建议?要清楚,我不关心自动递增,只需要唯一的主键值.
小智 2
就像你说的,Redshift不支持序列,所以你可以删除这部分:
select nextval(\'"companies_id_seq"\')
Run Code Online (Sandbox Code Playgroud)
你的插入语句应该是:
INSERT INTO companies
(name)
VALUES
('Acme')
Run Code Online (Sandbox Code Playgroud)
在您的表中,您将看到“Acme”有一个具有唯一值的 id 列。您无法将值插入到 id 列中,因此您无需在插入语句中指定它。它将自动填充。
这是更多解释:
http://docs.aws.amazon.com/redshift/latest/dg/c_Examples_of_INSERT_30.html
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |