[英]SQLAlchemy generates its own primary keys?
我已经开始将SQLAlchemy集成到我的应用程序中,以使用HP Vertica数据库。
到目前为止,基本功能运行良好,但是现在发生了一些非常奇怪的事情:
一个表具有一个auto_increment“ id”列。
映射到此表的模型如下所示:
class MyModel(ModelBase):
__tablename__ = "sometable"
id = Column(Integer, primary_key=True)
somefield = Column(Integer)
otherfield = Column(Integer)
因此,我正在创建一个新的MyModel
对象,并将其添加到会话中,如下所示:
my_model = MyModel(
somefield=...,
otherfield=...
)
session.add(my_model)
不传递“ id”参数,因为它是auto_increment。
调用session.commit()
,我从Vertica收到一个错误:
无法插入或更新IDENTITY / AUTO_INCREMENT列“ id”
我检查了异常以查看执行了什么SQL语句,并且看到将一个随机值传递给“ id”字段:
INSERT INTO "schemaname"."sometable" (id, somefield, otherfield) VALUES (3000001, 8781, 164)
我尝试做但没有起作用的事情:
autoincrement=True
和/或default=None
传递给模型中的id
MyModel
实例时,显式传递id=None
-SQLAlchemy仍然传递了随机值... 笔记:
经过大量调试后,我设法找到了解决方案。
问题在于Vertica方言只是一个补丁,它从PostgreSQL方言继承了大多数行为。
因此,当插入新记录时,显然在幕后发生的事情是发送nextval()
查询以从Vertica和Postgres都为自动递增(或串行)字段创建的内置序列中检索下一个ID。
因此,生成的ID实际上是在服务器端生成的。
但是 ,尽管PostgreSQL允许将值手动插入到串行字段中,但Vertica 不允许 。
解决方法:
我需要做的是将ID字段设置为INT
,而不使用auto_increment
,然后手动创建一个序列,该序列的名称类似于自动生成的序列(现已删除)。
就像是:
CREATE SEQUENCE sometable_id_seq START 1;
更新:
如lv10所述 ,一种更简单的解决方法也可能是使用原始SQL查询,而忽略ID参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.