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--
うん、それが問題のようだ!