2012-02-17 15 views
25

Próbuję użyć dict do wykonania SQL INSERT. Logika byłaby w zasadzie być:Używanie Dict Python dla instrukcji SQL INSERT

INSERT INTO table (dict.keys()) VALUES dict.values() 

Jednak mam trudny czas na zastanawianie się poprawnej składni/przepływ, aby to zrobić. To, co obecnie mam:

# data = {...} 
sorted_column_headers_list = [] 
sorted_column_values_list = [] 
for k, v in data.items(): 
    sorted_column_headers_list.append(k) 
    sorted_column_values_list.append(v) 
sorted_column_headers_string = ', '.join(sorted_column_headers_list) 
sorted_column_values_string = ', '.join(sorted_column_values_list) 

cursor.execute("""INSERT INTO title (%s) 
      VALUES (%s)""", 
      (sorted_column_headers_string, sorted_column_values_string)) 

Od tego otrzymuję wyjątek SQL (myślę, związanych z faktem, że przecinki są również zawarte w niektórych z wartościami, które mam). Jaki byłby właściwy sposób na powyższe?

Odpowiedz

15

Chcesz dodać symbole zastępcze dla zapytania. To może dostarczyć ci tego, czego potrzebujesz:

qmarks = ', '.join('?' * len(myDict)) 
qry = "Insert Into Table (%s) Values (%s)" % (qmarks, qmarks) 
cursor.execute(qry, myDict.keys() + myDict.values()) 
+7

dla MySQL: 'format = '' .join ([ '% s'] * len (dane)) ' – David542

+0

fyi: to nie działało dla mnie, ale odpowiedź @furicle zrobiła – Tjorriemorrie

35

Myślę, że komentarz dotyczący używania tego z MySQL nie jest kompletny. MySQLdb nie robić zmiany parametrów w kolumnach, tylko wartości (IIUC) - więc może raczej

placeholders = ', '.join(['%s'] * len(myDict)) 
columns = ', '.join(myDict.keys()) 
sql = "INSERT INTO %s (%s) VALUES (%s)" % (table, columns, placeholders) 
cursor.execute(sql, myDict.values()) 

Nie dostaniesz ucieczki na kolumnach chociaż, więc warto sprawdzić je najpierw .. ..

Zobacz http://mail.python.org/pipermail/tutor/2010-December/080701.html bardziej kompletne rozwiązanie

+4

Linia' cursor.execute (qry, columns, myDict.values ​​()) 'ma błąd składniowy. 'cursor.execute (qry, myDict.values ​​())' jest poprawną formą. – Mehraban

+3

czy jest jakiś problem z zamówieniem w systemie Dict? – zx1986

+1

Najlepsza odpowiedź w historii! – Aliweb

1
table='mytable'  
columns_string= '('+','.join(myDict.keys())+')'  
values_string = '('+','.join(map(str,myDict.values()))+')'  
sql = """INSERT INTO %s %s 
    VALUES %s"""%(table, columns_string,values_string) 
+0

Dobra odpowiedź. Kupuj scape pojedynczy cytat w join, aby był bardziej praktyczny. '(\' '+' \ ', \' '. join (myDict.keys()) +' \ ')' lub lepszy "(" "+" ',' ". join (myDict.keys()) + "") " – peter

-2

Co o:

keys = str(dict.keys()) 
keys.replace('[', '(') 
keys.replace(']', ')') 
keys.replace("'",'') 

vals = str(dict.values()) 
vals.replace('[', '(') 
vals.replace(']', ')') 

cur.execute('INSERT INTO table %s VALUES %s' % (keys, vals)) 

dla Pythona 3:

keys = str(dict.keys())[9:].replace('[', '').replace(']', '') 
vals = str(dict.values())[11:].replace('[', '').replace(']', '') 

...

5

zawsze dobre odpowiedzi tutaj, ale w Pythonie 3, należy napisać, co następuje:

placeholder = ", ".join(["%s"] * len(dict)) 
stmt = "insert into `{table}` ({columns}) values ({values});".format(table=table_name, columns=",".join(dict.keys()), values=placeholder) 
cur.execute(stmt, list(dict.values())) 

Nie zapomnij, aby przekształcić dict.values() listę, ponieważ w Pythonie 3, dict.values() zwraca widok, a nie listę.

Również zrobić NIE wlać dict.values() w stmt ponieważ łzy cytat z ciągiem przez join ing go, co spowodowało błąd MySQL w włożeniem. Powinieneś więc zawsze umieszczać go dynamicznie w cur.execute().

2

Próbowałem rozwiązania @ furicle, ale nadal dodaje wszystko jako ciąg - jeśli twój dykt jest mieszany, to może nie działać tak, jak byś tego chciał. Miałem podobny problem i właśnie to wymyśliłem - to tylko narzędzie do tworzenia zapytań i możesz go użyć (ze zmianami) do pracy z dowolną bazą danych, którą wybierzesz. Spójrz!

def ins_query_maker(tablename, rowdict): 
keys = tuple(rowdict) 
dictsize = len(rowdict) 
sql = '' 
for i in range(dictsize) : 
    if(type(rowdict[keys[i]]).__name__ == 'str'): 
     sql += '\'' + str(rowdict[keys[i]]) + '\'' 
    else: 
     sql += str(rowdict[keys[i]]) 
    if(i< dictsize-1): 
     sql += ', ' 
query = "insert into " + str(tablename) + " " + str(keys) + " values (" + sql + ")" 
print(query) # for demo purposes we do this 
return(query) #in real code we do this 

To jest prymitywne i nadal wymaga kontroli poczytalności itp., Ale działa zgodnie z przeznaczeniem. dla dict:

tab = {'idnumber': 1, 'fname': 'some', 'lname': 'dude', 'dob': '15/08/1947', 'mobile': 5550000914, 'age' : 70.4} 

uruchomieniem kwerendy I uzyskać następujące dane wyjściowe

results of query generated by the suite

Powiązane problemy