Pytanie w sprawie python, sqlite, dictionary – Python: Jak wstawić słownik do bazy danych sqlite?

6

Mam bazę danych sqlite z tabelą z następującymi kolumnami:

id(int) , name(text) , dob(text)

Chcę do niego wstawić następujący słownik:

{"id":"100","name":"xyz","dob":"12/12/12"}

Klucze słownika to nazwy kolumn. Jak mogę to osiągnąć?

nie można łatwo wstawić słownika, ale można wstawić listę. Spójrzw dokumentach DJJ
Co próbowałeś? Jak łączysz się z bazą danych? Czy używasz jakiegokolwiek ORM? pcalcao
Czy możesz podać kod, który próbujesz? shobhit
Możliwym rozwiązaniem byłoby zmodyfikowanie klasy IterChars () wdocs . Nie byłem jednak w stanie tego przystosować. Spojrzenie nasqlalchemy może również pomóc DJJ

Twoja odpowiedź

4   odpowiedź
8

Przeglądanie dokumentacjitutaj możesz dodać pojedynczy wiersz:

c.execute("INSERT INTO stocks VALUES (?,?,?)", [dict["id"], dict["name"], dict["dob"]])

Możesz też użyć listy i dodać wiele wierszy za jednym razem:

# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
Może zaktualizować to, aby pokazać, jak można wstawić listę słowników pytającego? Myślę, że twoja odpowiedź jest lepsza niż moja. Eliot Ball
1

MySQLdb możesz użyćexecutemany i podaj listę wartości, które możesz uzyskać bezpośrednio ze swojegodict za pomocądict.values()

Uważaj, aby posortować, gdy używasz tej metody, ponieważ kursor WSTAWI na podstawie kolejności, a słowniki nie utrzymują kolejności. Harrison
mała aktualizacja: słowniki utrzymują teraz porządek na poziomie 3.6, a to zachowanie będzie w specyfikacji języka od 3.7. Yekta Leblebici
4

Jeśli, na przykład,c = conn.cursor(), a twój słownik ma nazwędict i twój stółtablename, wtedy możesz pisać

c.execute('insert into tablename values (?,?,?)', [dict['id'], dict['name'], dict['dob']])

Który wstawi elementy słownika do tabeli zgodnie z potrzebami.

6

który zachowuje bezpieczeństwo parametrów. (Może wymagać polerowania w dziale nazw tabel)

def post_row(conn, tablename, rec):
    keys = ','.join(rec.keys())
    question_marks = ','.join(list('?'*len(rec)))
    values = tuple(rec.values())
    conn.execute('INSERT INTO '+tablename+' ('+keys+') VALUES ('+question_marks+')', values)

row = {"id":"100","name":"xyz","dob":"12/12/12"}
post_row(my_db, 'my_table', row)

Powiązane pytania