2016-10-04 7 views
0

Lassen Sie uns sagen, dass ich eine Python-Liste von Kunden-ID wie dieses:Wählen Sie den Namen wo ID = "in der Python-Liste"?

id = ('12','14','15','11',.......) 

das Array 1000 Werte drin, und ich brauche den Namen des Kunden in eine Tabelle auf den IDs aus der Liste oben anhand einzufügen.

mein Code wie:

ids = ",".join(id) 
sql = "insert into cust_table(name)values(names)where cust_id IN('ids')" 
cursor.execute(sql) 

nach Ausführen des Codes, ich nichts in die Tabelle eingefügt bekommen. Welchen Fehler habe ich?

Bitte helfen :(

+3

Vorsicht [Bobby Tables] (https://xkcd.com/327/). –

+0

Programmierung ist nicht/durchaus/Magie;) – hop

Antwort

0

Sie müssen die Zeichenfolge zu formatieren.

ids = ",".join(id) 
sql = "insert into cust_table(name)values(names)where cust_id IN('{ids}')" 
cursor.execute(sql.format(ids= ids)) 
+2

parametrisierte SQL wäre noch besser. siehe zum Beispiel http://stackoverflow.com/questions/8671702/passing-list-of-parameters-to-sql-in-psycopg2 – hop

0

einfach den Namen einer Variablen in einen String Schreiben nicht auf magische Weise seinen Inhalt in der Zeichenfolge erscheinen.

>>> p = 'some part' 
>>> s = 'replace p of a string' 
>>> s 
'replace p of a string' 
>>> s = 'replace %s of a string' % p 
>>> s 
'replace some part of a string' 
>>> s = 'replace {} of a string'.format(p) 
>>> s 
'replace some part of a string' 

In Ihrem Fall würde dies bedeuten:

>>> sql = "insert into cust_table (name) values (names) where cust_id IN ('%s')" 
>>> ids = ", ".join(id) 
>>> cursor.execute(sql % ids) 

obwohl ich stark vermuten, dass Sie ein ähnliches Problem mit names haben.

Um mögliche SQL-Injection-Probleme zu vermeiden, wäre es vorzuziehen, eine "parametrisierte Anweisung" zu verwenden. Dies würde in etwa so aussehen:

>>> sql = 'insert into ... where cust_id IN %s' 
>>> cursor.execute(sql, (id,)) 

Einige Datenbank-Anschlüsse für Python sind dazu in der Lage, aber dein ist wahrscheinlich nicht.

Eine Abhilfe könnte sein, so etwas wie

>>> params = ', '.join(['%s']*len(id)) 
>>> sql = 'insert into ... where cust_id IN (%s)' % params 
>>> cursor.execute(sql, id) 
Verwandte Themen