gpt4 book ai didi

python - SQLAlchemy 生成自己的主键?

转载 作者:行者123 更新时间:2023-12-01 02:36:00 34 4
gpt4 key购买 nike

我已开始将 SQLAlchemy 集成到我的应用程序中,以使用 HP Vertica 数据库。
到目前为止,基本功能运行良好,但现在发生了一些非常奇怪的事情:

一个表有一个 auto_increment“id”列。
映射到该表的模型如下所示:

class MyModel(ModelBase):
__tablename__ = "sometable"

id = Column(Integer, primary_key=True)
somefield = Column(Integer)
otherfield = Column(Integer)

因此,我正在创建一个新的 MyModel 对象并将其添加到 session 中,如下所示:

my_model = MyModel(
somefield=...,
otherfield=...
)
session.add(my_model)

不传递“id”参数,因为它是 auto_increment。
调用 session.commit() 时,我从 Vertica 收到错误:
无法插入或更新 IDENTITY/AUTO_INCRMENT 列“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 dialect ,它是 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 参数。

关于python - SQLAlchemy 生成自己的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46221741/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com