sql >> データベース >  >> NoSQL >> MongoDB

psycopg2は、構文エラーで多くのステートメントの実行に失敗します

    ここで何が起こっているかをもう少し明確に確認するには、そのエラーメッセージの引用符を外してみてください。 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は小さな^を慎重に使用します 混乱した行の正確な場所を指す文字—ただし、ここでは、前面に配置されている「行1」ラベルの中央を指しています。 それを混乱させた線の。おそらく、Stack Overflowにカットアンドペーストすると、いくつかの連続したスペースが一緒に折りたたまれます。これは、エディターまたはブラウザーが不快な気分だった場合に発生する可能性があります。

    したがって、エラーが発生した行の正確な場所はわかりませんが、非常に強い推測があります。どういうわけか、ステートメントを囲んでいるPythonのトリプルクォートが実際にPostgresに渡されています。 Postgresプロンプトで数分間遊んだ後、のみ 「LINE」がトリプルクォートで始まる「構文エラー」メッセージを取得する方法は、実際にはトリプルクォートが属していないSQLに手動で入力することです(Postgresはトリプルクォートを理解していないため、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コードをもう一度確認してみてください。文字列内でリテラル引用符がどのように終了するかを把握するのに役立ちます!




    1. サブドキュメントの配列からフィールド値を取得します

    2. NodeJSからMongoDBにセッションを保存する方法は?

    3. AmazonEC2でのMongodbへのアクセスに関する問題

    4. PythonとMongoDB:NoSQLデータベースへの接続