Ruby 续集添加一个“返回空”到我的插入。如何禁用它?

Ruby 续集添加一个“返回空”到我的插入。如何禁用它?,ruby,postgresql,sequel,Ruby,Postgresql,Sequel,我正在使用Ruby Sequel ORM gem连接到Postgres数据库。我没有使用任何模型。我的insert语句似乎自动附加了一个返回null,因此不会返回新插入的行id/pk。这有什么用?为什么这是默认值?更重要的是,如何在连接范围内禁用it 另外,我注意到有一个dataset.returning方法,但它似乎不起作用 require 'sequel' db = Sequel.connect 'postgres://user:secret@localhost/foo' tbl = "p

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

另外,我注意到有一个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似乎自动运行一个查询来确定一个表的主键,在我的例子中,主键是在链上的一个表上定义的,没有找到哪个,也许返回的null被追加了

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);

我在我的应用程序中没有观察到这一点。显示一些代码。很高兴你解决了它。干得好哈,谢谢。但可悲的是,目前还没有找到解决方案!如果你能想出如何修改pk lookup查询来处理表继承而不破坏东西,我肯定愿意接受一个补丁。