我正在使用Ruby Sequel(ORM gem)连接到Postgres数据库。我没有使用任何型号。我的insert语句似乎自动附加了一个“返回null”(因此不会返回新插入的行id / pk)。这有什么用?为什么这是默认的?更重要的是,如何禁用它(连接范围)?
另外,我注意到有一个数据集。返回方法,但它似乎不起作用!
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是在链上的一个表上定义的),而不是找到哪个,或许正在追加“返回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 -
是的,看起来就像是问题!答案 0 :(得分:-1)
如果您正在使用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);