У вас есть этот код Python:
c.execute("insert into medicoes values(?,?,?,?,?,?,?)" % keys)
которое, я думаю, должно быть
c.execute("insert into medicoes values (?,?,?,?,?,?,?)", keys)
, поскольку оператор %
ожидает, что строка слева содержит коды форматирования.
Теперь все, что вам нужно для этой работы, - это чтобы keys
был кортежем (или списком), содержащим значения для новой строки таблицы Medicoes в правильном порядке. Рассмотрим следующий код Python:
import json
traffic = json.load(open('xxx.json'))
columns = ['local', 'coord', 'sentido', 'veiculos', 'modalidade', 'pistas']
for timestamp, data in traffic.iteritems():
keys = (timestamp,) + tuple(data[c] for c in columns)
print str(keys)
Когда я запускаю это с вашими примерами данных, я получаю:
(u'2011-12-19 08:38', u'R. Fernandes Vieira; esquina Prot\xe1sio Alves', u'-30.035535,-51.211079', u'\xfanico', u'automotores', u'sem\xe1foro 30-70', u'3')
(u'2011-12-17 16:00', u'Av. Prot\xe1sio Alves; esquina Ramiro Barcelos', u'-30.036916,-51.208093', u'bairro-centro', u'automotores', u'semaforo 50-15', u'2+c')
, который может показаться нужным вам кортежем.
Вы можете добавить необходимый sqlite-код примерно так:
import json
import sqlite3
traffic = json.load(open('xxx.json'))
db = sqlite3.connect("fluxos.sqlite")
query = "insert into medicoes values (?,?,?,?,?,?,?)"
columns = ['local', 'coord', 'sentido', 'veiculos', 'modalidade', 'pistas']
for timestamp, data in traffic.iteritems():
keys = (timestamp,) + tuple(data[c] for c in columns)
c = db.cursor()
c.execute(query, keys)
c.close()
Редактировать: Если вы не хотите жестко кодировать список столбцов, вы можете сделать что-то вроде этого:
import json
traffic = json.load(open('xxx.json'))
someitem = traffic.itervalues().next()
columns = list(someitem.keys())
print columns
Когда я запускаю это, он печатает:
[u'medicoes', u'veiculos', u'coord', u'modalidade', u'sentido', u'local', u'pistas', u'regime']
Вы можете использовать его с чем-то вроде этого:
import json
import sqlite3
db = sqlite3.connect('fluxos.sqlite')
traffic = json.load(open('xxx.json'))
someitem = traffic.itervalues().next()
columns = list(someitem.keys())
columns.remove('medicoes')
columns.remove('regime')
query = "insert into medicoes (timestamp,{0}) values (?{1})"
query = query.format(",".join(columns), ",?" * len(columns))
print query
for timestamp, data in traffic.iteritems():
keys = (timestamp,) + tuple(data[c] for c in columns)
c = db.cursor()
c.execute(query)
c.close()
Запрос, который печатает этот код, когда я пробую его с вашими примерами данных, выглядит примерно так:
insert into medicoes (timestamp,veiculos,coord,modalidade,sentido,local,pistas) values (?,?,?,?,?,?,?)