python sqlite insert named parameters or null python sqlite insert named parameters or null python python

python sqlite insert named parameters or null


Use None to insert a NULL:

dict = {'location': 'somewhere', 'arrival': '1000', 'departure': None}

You can use a default dictionary and a generator to use this with executemany():

defaults = {'location': '', 'arrival': None, 'departure': None}c.executemany(SQL, ({k: d.get(k, defaults[k]) for k in defaults} for d in your_list_of_dictionaries)


There is a simpler solution to this problem that should be feasible in most cases; just pass to executemany a list of defaultdict instead of a list of dict.

In other words, if you build from scratch your rows as defaultdict you can pass the list of defaultdict rows directly to the command executemany, instead of building them as dictionaries and later patch the situation before using executemany.

The following working example (Python 3.4.3) shows the point:

import sqlite3from collections import defaultdict# initializationdb = sqlite3.connect(':memory:')c = db.cursor()c.execute("CREATE TABLE status(location TEXT, arrival TEXT, departure TEXT)")SQL = "INSERT INTO status VALUES (:location, :arrival, :departure)"# build each row as a defaultdictf = lambda:None # use str if you preferrow1 = defaultdict(f,{'location':'place1', 'departure':'1000'})row2 = defaultdict(f,{'location':'place2', 'arrival':'1010'})rows = (row1, row2)# insert rows, executemany can be safely used without additional codec.executemany(SQL, rows)db.commit()# print resultc.execute("SELECT * FROM status")print(list(zip(*c.description))[0])for r in c.fetchall():    print(r)db.close()

If you run it, it prints:

('location', 'arrival', 'departure')('place1', None, '1000') # None in Python maps to NULL in sqlite3('place2', '1010', None)