1

Ruby Sequel (ORM gem) を使用して Postgres データベースに接続しています。私はどのモデルも使用していません。私の挿入ステートメントには、「null を返す」が自動的に追加されているようです (したがって、新しく挿入された行 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 テーブル継承を使用)

ルビー 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--

うん、それが問題のようだ!

4

1 に答える 1

-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問題があるように思えます。

次の方法で、2番目の制約を最初の制約に後付けできます。

ALTER TABLE my_child ADD PRIMARY KEY(id);
ALTER TABLE my_child ADD UNIQUE (my_value);
于 2013-03-23T12:05:41.403 に答える