2017-06-29 6 views
0

Ich bin neu in Python und arbeiten mit der Verwendung der Psycopg2 zum Einfügen von Daten in Postgres-Datenbank. Ich versuche, Elemente einzufügen, aber die FehlermeldungPython psycopg2 Syntax Fehler

bekommen „Psycopg2.ProgrammingError: Syntaxfehler bei oder in der Nähe von "cup" LINE 1: INSERT INTO store VALUES (7,10.5, Kaffeetasse)

mit dem^neben Kaffeetasse. ich gehe davon aus der Reihenfolge falsch ist, aber ich dachte, dass Sie es auf diese Weise so lange geben könnten, wie Sie die Werte angegeben.

Hier ist der Code.

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

Sie String-Interpolation direkt in SQL-Abfragen nicht. Es macht Sie anfällig für [sql injection attacks] (https://xkcd.com/327/). In diesem Fall wird die Abfrage auch falsch formatiert. –

+0

Danke Paul. Ich bin sehr neu in der Python und Psycopg2, und folgte Beispielen im Internet, um meine Füße nass zu machen, wie die Dinge funktionieren. Wie würden Sie in diesem Fall SQL-Injektionen im obigen Code vermeiden? Psycocg2-Dokument empfohlen, dass% s verwendet werden sollte, unabhängig davon, welche Art von Daten übergeben wird. Jede Hilfe würde sehr geschätzt werden. – IpSp00f3r

Antwort

1

Remembe r verwendet immer das zweite Argument des Befehls execute, um die Variablen zu übergeben, wie angegeben here.

Verwenden Sie auch den Namen der Felder in Ihrer Syntax:

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

, die den Trick tun sollten.

+0

Das funktionierte wie ein Zauber. Danke, dass Sie mich in die richtige Richtung weisen – IpSp00f3r

0

Problem in Ihrem Fall ist Kaffeetasse Parameterwert gilt als Zeichenfolge, aber psycopg2 akzeptieren den Wert im einfachen Anführungszeichen. Grundsätzlich nach meinem Verständnis, wenn wir SQL-Abfrage für psycopg2 erstellen, fragen Sie nach einem einfachen Anführungszeichen für Datenparameter [Wenn Sie doppelte Anführungszeichen für Abfrage Anfang und Ende gegeben haben] In Ihrem Fall haben Sie doppelte Anführungszeichen für Query geben und so enden Sie müssen ein einfaches Angebot für die Parameter geben.


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')