it-swarm.com.de

Konvertieren Sie JSON in SQLite in Python - Wie ordne ich JSON-Schlüssel den Datenbankspalten richtig zu?

Ich möchte eine von mir erstellte JSON-Datei in eine SQLite-Datenbank konvertieren.

Meine Absicht ist es, später zu entscheiden, welcher Datencontainer und Einstiegspunkt am besten ist, json (Dateneingabe über Texteditor) oder SQLite (Dateneingabe über spreadsheet-ähnliche GUIs wie SQLiteStudio).

Meine json-Datei sieht folgendermaßen aus (enthält Verkehrsdaten von einigen Kreuzungen in meiner Stadt):

...
"2011-12-17 16:00": {
    "local": "Av. Protásio Alves; esquina Ramiro Barcelos",
    "coord": "-30.036916,-51.208093",
    "sentido": "bairro-centro",
    "veiculos": "automotores",
    "modalidade": "semaforo 50-15",
    "regime": "típico",
    "pistas": "2+c",
    "medicoes": [
        [32, 50],
        [40, 50],
        [29, 50],
        [32, 50],
        [35, 50]
        ]
    },
"2011-12-19 08:38": {
    "local": "R. Fernandes Vieira; esquina Protásio Alves",
    "coord": "-30.035535,-51.211079",
    "sentido": "único",
    "veiculos": "automotores",
    "modalidade": "semáforo 30-70",
    "regime": "típico",
    "pistas": "3",
    "medicoes": [
        [23, 30],
        [32, 30],
        [33, 30],
        [32, 30]
        ]
    }
...

Und ich habe eine Nice-Datenbank mit einer Eins-zu-Viele-Beziehung mit diesen Zeilen von Python Code erstellt:

import sqlite3

db = sqlite3.connect("fluxos.sqlite")
c = db.cursor()

c.execute('''create table medicoes
         (timestamp text primary key,
          local text,
          coord text,
          sentido text,
          veiculos text,
          modalidade text,
          pistas text)''')

c.execute('''create table valores
         (id integer primary key,
          quantidade integer,
          tempo integer,
          foreign key (id) references medicoes(timestamp))''')

ABER das Problem ist, als ich mich vorbereitete, die Zeilen mit den tatsächlichen Daten mit etwas wie c.execute("insert into medicoes values(?,?,?,?,?,?,?)" % keys) einzufügen, wurde mir klar, dass das aus der JSON-Datei geladene Diktat keine spezielle Reihenfolge hat und nicht richtig zugeordnet werden kann die Spaltenreihenfolge der Datenbank.

Ich frage also: "Welche Strategie/Methode soll ich verwenden, um die Schlüssel aus jedem" Block "in der JSON-Datei programmgesteuert zu lesen (in diesem Fall" local "," coord "," sentido "," veiculos "," modalidade ") "," regime "," pistas "und" medicoes "), erstellen Sie die Datenbank mit den Spalten in derselben Reihenfolge und fügen Sie dann die Zeilen mit den richtigen Werten ein"?

Ich habe eine gute Erfahrung mit Python, beginne jedoch erst mit SQL, und möchte daher einige Ratschläge zu guten Praktiken erhalten, und nicht unbedingt ein fertiges Rezept.

44
heltonbiker

Sie haben diesen python code:

c.execute("insert into medicoes values(?,?,?,?,?,?,?)" % keys)

was ich denke sollte sein

c.execute("insert into medicoes values (?,?,?,?,?,?,?)", keys)

seit der % operator erwartet, dass die Zeichenfolge links davon Formatierungscodes enthält.

Jetzt müssen Sie nur noch dafür sorgen, dass keys ein Tupel (oder eine Liste) ist, die die Werte für die neue Zeile der Medikamententabelle in der richtigen Reihenfolge enthält. Betrachten Sie den folgenden Code 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)

Wenn ich dies mit Ihren Beispieldaten ausführe, erhalte ich:

(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')

das scheinen die Tupel zu sein, die Sie benötigen.

Sie können den erforderlichen SQLite-Code folgendermaßen hinzufügen:

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()

Bearbeiten: Wenn Sie die Liste der Spalten nicht hart codieren möchten, können Sie Folgendes tun:

import json

traffic = json.load(open('xxx.json'))

someitem = traffic.itervalues().next()
columns = list(someitem.keys())
print columns

Wenn ich das starte, druckt es:

[u'medicoes', u'veiculos', u'coord', u'modalidade', u'sentido', u'local', u'pistas', u'regime']

Sie könnten es mit so etwas verwenden:

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()

Die Abfrage, die dieser Code ausgibt, wenn ich sie mit Ihren Beispieldaten versuche, sieht ungefähr so ​​aus:

insert into medicoes (timestamp,veiculos,coord,modalidade,sentido,local,pistas) values (?,?,?,?,?,?,?)
44
srgerg