2017-06-29 15 views
0

私はpythonに新しく、psycopg2を使用してpostgresデータベースにデータを挿入しようとしています。私はアイテムを挿入しようとしているが、エラーメッセージが出Python psycopg2構文エラー

「Psycopg2.ProgrammingError:構文エラーまたはその付近 "AMカップ" LINE 1:店舗VALUES。INSERT INTO(7,10.5、コーヒーカップ)

^コーヒーカップの横で。私は順序が間違っているが、私はあなたがこの方法限り、あなたは値を指定したとして、それを入力すると考えていたと仮定しています。

ここでは、コードです。

import psycopg2 

def create_table(): 
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'") 
    cur=conn.cursor() 
    cur.execute("CREATE TABLE IF NOT EXISTS store (item TEXT, quantity INTEGER, price REAL)") 
    conn.commit() 
    conn.close() 

def insert(quantity, price, item): 
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'") 
    cur=conn.cursor() 
    cur.execute("INSERT INTO store VALUES(%s,%s,%s)" % (quantity, price, item)) 
    conn.commit() 
    conn.close() 

create_table() 
insert(7, 10.5, 'coffee cup') 
+0

SQLクエリで直接文字列補間をしないでください。あなたは[SQLインジェクション攻撃](https://xkcd.com/327/)に脆弱になります。この場合、クエリのフォーマットが不適切になります。 –

+0

ありがとうPaul。私はpythonとpsycopg2の新機能を使い、どのように動作しているかを自分の足で濡らすためのWeb上の例に従っていました。この場合、上記のコードでどのようにSQLインジェクションを避けますか? Psycocg2の文書では、渡されるデータの種類に関係なく、%sを使用するように指示されています。どんな助けでも大歓迎です。 – IpSp00f3r

答えて

1

Remembe rは、hereのように、実行コマンドの第2引数を常に使用して変数を渡します。

また、あなたの構文内のフィールドの名前を使用します。

cur.execute("INSERT INTO store (item, quantity, price) VALUES (%s, %s, %s);", (item, quantity, price)) 

トリックを行う必要があること。

+0

これは魅力的に機能しました。私に正しい方向を指してくれてありがとう – IpSp00f3r

0

あなたのケースの問題はコーヒーカップパラメータ値は文字列と見なされますが、psycopg2は一重引用符で値を受け入れます。 psycopg2のSQLクエリを作成するときの基本的なところは、データパラメータの一重引用符を求めることです[クエリの開始と終了に二重引用符を指定した場合] クエリの開始と終了を二重引用符で指定しましたパラメータの一重引用符を与える必要があります。


My Observation is you provide single quote for each data paramater in psycopg2


import psycopg2 

def create_table(): 
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'") 
    cur=conn.cursor() 
    cur.execute("CREATE TABLE IF NOT EXISTS store (item TEXT, quantity INTEGER, price REAL)") 
    conn.commit() 
    conn.close() 

def insert(quantity, price, item): 
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'") 
    cur=conn.cursor() 
    #cur.execute("INSERT INTO store VALUES(%s,%s,%s)" % (quantity, price, item)) 
    cur.execute("INSERT INTO store VALUES('%s','%s','%s')" % (quantity, price, item)) 
    conn.commit() 
    conn.close() 

create_table() 
insert(7, 10.5, 'coffee cup')