gpt4 book ai didi

ruby - 续集将 "returning null"添加到我的插入内容中。我该如何禁用它?

转载 作者:行者123 更新时间:2023-11-29 14:03:16 25 4
gpt4 key购买 nike

我正在使用 Ruby Sequel(ORM gem)连接到 Postgres 数据库。我没有使用任何模型。我的插入语句似乎自动附加了一个“返回空值”(因此不会返回新插入的行 id/pk)。这有什么用?为什么这是默认值?更重要的是,如何禁用它(连接范围)?

此外,我注意到有一个 dataset.returning 方法,但它似乎不起作用!

require 'sequel'

db = Sequel.connect 'postgres://user:secret@localhost/foo'
tbl = "public__bar".to_sym #dynamically generated by the app
dat = {x: 1, y: 2}
id = db[tbl].insert(dat) #generated sql -- INSERT INTO "public"."bar" ("x", "y") VALUES (1, 2) RETURNING NULL

不知道这是否重要,但有问题的表是继承的(使用 postgres 表继承)

ruby 1.9.3p392 (2013-02-22) [i386-mingw32]

续集(3.44.0)

--编辑 1 -- 经过一些故障排除--

看起来表继承可能是这里的问题。 Sequel 似乎自动运行一个查询来确定表的 pk(在我的例子中,pk 是在链上的表上定义的),找不到哪个,也许是附加了“返回空值”?

SELECT pg_attribute.attname AS pk FROM pg_class, pg_attribute, pg_index, pg_namespace WHERE pg_class.oid = pg_attribute.attrelid AND pg_class.relnamespace = pg_namespace.oid AND 
pg_class.oid = pg_index.indrelid AND pg_index.indkey[0] = pg_attribute.attnum AND pg_index.indisprimary = 't' AND pg_class.relname = 'bar'
AND pg_namespace.nspname = 'public'

--编辑2--

是的,看起来这就是问题所在!

最佳答案

如果您使用 PostgreSQL 继承,请注意以下继承:

  • 主键

  • 唯一约束

  • 外键

一般来说,您必须在每个 子表上声明这些。例如:

CREATE TABLE my_parent (
id bigserial primary key,
my_value text not null unique
);
CREATE TABLE my_child() INHERITS (my_parent);
INSERT INTO my_child(id, my_value) values (1, 'test');
INSERT INTO my_child(id, my_value) values (1, 'test'); -- works, no error thrown

你想要的是这样做:

CREATE TABLE my_parent (
id bigserial primary key,
my_value text not null unique
);
CREATE TABLE my_child(
primary key(id),
unique(my_value)
) INHERITS (my_parent);
INSERT INTO my_child(id, my_value) values (1, 'test');
INSERT INTO my_child(id, my_value) values (1, 'test'); -- unique constraint violation thrown

在我看来,您似乎有一些紧急的 DDL 问题需要解决。

您可以通过以下方式将第二个约束改造到第一个上:

ALTER TABLE my_child ADD PRIMARY KEY(id);
ALTER TABLE my_child ADD UNIQUE (my_value);

关于ruby - 续集将 "returning null"添加到我的插入内容中。我该如何禁用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15508093/

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