私が間違った条件を使用した場合、まずはご容赦ください。非常に PostgreSQLとNoSQLスタイルのデータストレージの両方に新しいものです。移動先:自動増分フィールドを含むJSON列をPostgresに挿入しますか?
私は、.NETプロジェクトをPostgreSQLデータベースに接続するためにnpgsqlを使用しています。 NoSQLのドキュメントストレージとして使用しています。テーブルはプライマリキーid
の列とdata
の列のjsonbオブジェクトで構成されています。
data
の列では、各挿入に自動的にインクリメントするidフィールドを生成する方法も必要です。このIDは必ずしもプライマリキーと一致する必要はありませんが、それは私が働いている前提の一種です。
私は次のスクリプトを使用して、pgAdminで、この作品を作ることができました:
drop table public.testjson;
drop sequence public.testjson_id_seq;
CREATE SEQUENCE public.testjson_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
ALTER TABLE public.testjson_id_seq
OWNER TO login;
CREATE TABLE public.testjson
(
id bigint NOT NULL DEFAULT nextval('testjson_id_seq'::regclass),
data jsonb,
CONSTRAINT testjson_pkey PRIMARY KEY (id)
);
ALTER TABLE public.testjson
OWNER TO login;
-- Insert data using currval --
INSERT INTO testjson (data) VALUES(to_jsonb('{"jsonid": '||currval('testjson_id_seq'::regclass)::bigint||', moreStuff: "all the stuff!"}'));
INSERT INTO testjson (data) VALUES(to_jsonb('{"jsonid": '||currval('testjson_id_seq'::regclass)::bigint||', moreStuff: "all the stuff!"}'));
INSERT INTO testjson (data) VALUES(to_jsonb('{"jsonid": '||currval('testjson_id_seq'::regclass)::bigint||', moreStuff: "all the stuff!"}'));
INSERT INTO testjson (data) VALUES(to_jsonb('{"jsonid": '||currval('testjson_id_seq'::regclass)::bigint||', moreStuff: "all the stuff!"}'));
select * from testjson
-- Output --
id | data
---------------------------------------------------------
1 | "{\"jsonid\": 1, moreStuff: \"all the stuff!\"}"
2 | "{\"jsonid\": 2, moreStuff: \"all the stuff!\"}"
3 | "{\"jsonid\": 3, moreStuff: \"all the stuff!\"}"
4 | "{\"jsonid\": 4, moreStuff: \"all the stuff!\"}"
currval
の代わりに
nextval
(重複を引き起こす競合状態を防ぐため)を使用しますが、それに関する問題はありません。私はコード側でこれを複製するのに問題があります。
var crcmd = new NpgsqlCommand("INSERT INTO "+_schema+"."+table+" ("+JsonColumn+") VALUES (:json) RETURNING id;", _conn);
var jsonData = getSerializedJsonData(thing, primaryKey);
crcmd.Parameters.AddWithValue("json", NpgsqlDbType.Jsonb, jsonData);
returnId = (long) crcmd.ExecuteScalar();
...
private string getSerializedJsonData<T>(T thing, string primaryKey, string tableSeq)
{
var jsonThing = JsonConvert.SerializeObject(thing);
var bracketIndex = jsonThing.IndexOf('{');
var thingPrefix = jsonThing.Substring(0, bracketIndex + 1);
var thingData = jsonThing.Substring(bracketIndex + 1);
var pkEntry = "\"" + primaryKey +"\": currval('" + tableSeq + '::regclass)::bigint, ";
jsonThing = thingPrefix + pkEntry + thingData;
return jsonThing;
}
しかし、私はそれをテストしようとすると、次の例外がスローされます:ここでは他のquestionsで周りを見ると、これはうまくいくかもしれないことを信じるように私を導い
Npgsql.PostgresException: 22P02: invalid input syntax for type json; Token "currval" is invalid
私が間違っているのは何ですか?
:だから、最終的な、作業のコードは、より多くのこのようになります。あなたはもっと良い解決策を見つけましたか? – piojo