0

libpqxx と準備済みステートメントを使用しています。プログラムで挿入しようとすると、「無効なジオメトリ」というエラーで失敗しますが、SQL プロンプトから同じ挿入を行うことができます。準備ステートメント呼び出しで ' をエスケープしようとしましたが、同じエラーが発生しました

con.prepare("chat_insert", "INSERT INTO chat values (nextval('chat_seq'), $1, ST_GeomFromText('POINT($2 $3)', 4326), $4)");
worker.prepared("chat_insert")(chatid)(lon)(lat)(msg).exec();
worker.commit();

私も試しました

con.prepare("chat_insert", "INSERT INTO chat values (nextval('chat_seq'), $1, ST_GeomFromText(\'POINT($2 $3)\', 4326), $4)");

出力:

Chat id: chat:user:128946234
Lat: 14.6049
Lon: 121.033
ERROR:  parse error - invalid geometry
HINT:  "POINT(" <-- parse error at position 6 within geometry

SQLプロンプトに入ると、これを実行でき、挿入されます

insert into chat values (nextval('chat_seq'), 'chat:user:128946234', ST_GeomFromText('POINT(121.033 14.6049)', 4326), 'This is a test msg....');
4

1 に答える 1

0

POINT($2 $3)ドル記号が含まれる WKT 文字列を解析しようとしています。WKT は文字列であるため、これらはこのコンテキストではパラメーターではありません。

次のような数値パラメータを受け入れる関数を使用しますST_MakePoint(x, y)

con.prepare("chat_insert", "INSERT INTO chat (chatid, geom, msg) "
            "VALUES ($1, ST_SetSRID(ST_MakePoint($2, $3), 4326), $4)");

の後に挿入する列をリストしたことに注意してくださいchat。これはベスト プラクティスと見なされます。

于 2014-08-13T22:32:50.173 に答える