繁体   English   中英

SQLAlchemy生成自己的主键?

[英]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仍然传递了随机值...

笔记:

  • 为了使用SQLAlchemy和Vertica,我使用vertica_python驱动程序和sqlalchemy - vertica -python方言 ,它是sqlalchemy的Postgres方言的继承者。 我试图将这种错误归咎于方言,但是我看了看它的代码(它很小),似乎一点都没有影响。
  • SQLAlchemy版本= 1.1.13
  • Python = 3.5

经过大量调试后,我设法找到了解决方案。
问题在于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM