psycopg2が構文エラーで多くの文を実行すると失敗する

私は mongodb のようなデータを持っています

data = 
(
 {
   u'name': 'A',
   u'primary_key': 1
 },
 {
   u'name': 'B',
   u'primary_key': 2
 },
 {
   u'name': 'C',
   u'primary_key': 3
 }
)

私が次のことを呼ぶとき

cur = conn.cursor()
cur.executemany("""INSERT INTO ddmension(id,name) VALUES (%(primary_key)s, %(name)s)""", data) 

それは言って失敗する

ProgrammingError: 'syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E\'A\')""""\nLINE 1: """INSERT INTO dimension (id, name) VALUES (1, E\'A\n ^\n'  

問題が何であるか教えてもらえますか?私はこのチュートリアルに従っています

ありがとうございました

0
追加された
ビュー: 1
テーブル名にタイプミスがあるという事実は、あなたが得た正確なコードや出力を投稿しなかったことを意味します。
追加された 著者 jfs,
cur.mogrify(args_to_executemany)で示されるものは何ですか?
追加された 著者 jfs,

1 答え

そのエラーメッセージを引用符で囲まずに試して、ここで何が起こっているのかを少しはっきりと見てみるべきです。 Pythonプロンプトでこれを行うことができます:

>>> message = 'syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E\'A\')""""\nLINE 1: """INSERT INTO dimension (id, name) VALUES (1, E\'A\n ^\n'
>>> print message
syntax error at or near """"INSERT INTO dimension (id, name) VALUES (1, E'A')""""
LINE 1: """INSERT INTO dimension (id, name) VALUES (1, E'A
 ^

ああ、はるかに良い。

通常、Postgresは混乱している行の正確な場所を指すために小さな ^ 文字を使用しますが、ここでは "Line 1"ラベルの中央を指していますそれを混乱させた行の front を挿入します。 Stack Overflowへの切り取りと貼り付けは、エディタやブラウザが不快な気分になった場合に起こりうる、連続した複数のスペースを一緒に崩壊させた可能性があります。

だから私はエラーが発生した行を正確には分かりませんが、私は非常に強い推測をしています:何とか、あなたの文を囲むようにしているPythonの三重引用符が実際にPostgresに渡されています! Postgresプロンプトで数分間プレイした後、 "LINE"が三重引用符で始まる "構文エラー"メッセージを得るためののみの方法は、実際に三重引用符を手動でSQLには属していません(Postgresは3重引用符を理解しないので、Pythonの規約です)。

$ psql postgres 
Null display is "NULL".
psql (8.4.8)
Type "help" for help.

postgres=# """SELECT 1""";
ERROR:  syntax error at or near """"SELECT 1""""
LINE 1: """SELECT 1""";
        ^

問題は、表示したサンプルコードではこのエラーが発生しないことです。このエラーを取得するには、実際には次のようにPythonコードを入力しなければなりませんでした。

cur.executemany('"""INSERT INTO ddmension(id,name) ..."""', data) 

Python文字列の中に三重引用符を付ける他の方法もありますが、これが最も簡単です。いずれにしても、Postgresのエラーメッセージは三重引用符がSQLの内部に入っていることを最も確実に示しているので、Pythonコードを再度チェックしてみてください。

0
追加された