2016-05-19 5 views
0

Ich ziehe Daten von einer Website mit ihrer API. Ich möchte dann die Daten in einer Datenbank speichern. Für einige der Felder muss ich einen Abschnitt der JSON-Daten speichern, die in ein Feld gezogen wurden.Json Daten in ein SQLite-Feld mit Python 3

Das Tabellenlayout wird diese erstellt mit:

cur.execute('create table if not exists KillData(KillID INT, Victim TEXT, KillTime TEXT, System INT,' 
      ' Attackers TEXT, Items TEXT, Price REAL)') 

Dies ist, was habe ich jetzt die Daten einzufügen:

for kill_mail in response: 
    kill = KillMail(kill_mail) 
    cur.execute("insert into KillData values(?, ?, ?, ?, ?, ?, ?)", 
       (int(kill.get_kill_id()), kill.get_victim(), kill.get_kill_time(), kill.get_system(), 
       kill.get_attackers, kill.get_items(), kill.get_price())) 

wo KillMail nur eine Klasse, die bestimmte zu bekommen verwendet wird Werte innerhalb der JSON-Daten. Zum Beispiel:

class KillMail: 
def __init__(self, json_kill_mail): 
    self.json_kill_mail = json_kill_mail 

def get_attackers(self): 
    return json.dumps(self.json_kill_mail['attackers']) 

def get_items(self): 
    return json.dumps(self.json_kill_mail['items']) 

kill.get_attackers und kill.get_items() enthalten Elemente in sie, weil es einen Angreifer/Stück oder bis zu 100 oder mehr nur sein können. Aus diesem Grund denke ich, dass das Speichern der Daten im JSON-Format als String am besten ist, so dass ich beim Ziehen einfach json.load() verwenden kann, um das JSON-Objekt zu rekonstruieren, um daraus Informationen zu ziehen.

Der Fehler, den ich immer bin, wenn der Code ausgeführt wird:

in main kill.get_attackers, kill.get_items(), kill.get_price())) sqlite3.InterfaceError: Error binding parameter 4 - probably unsupported type.

Das einzige, was ich online über das Tun ist this finden konnten.

Ich versuchte die vorgeschlagenen Dinge in diesem Beitrag, aber nichts schien zu funktionieren. Ich habe auch versucht, die beiden Felder zu BLOBs zu ändern, aber das gab den gleichen Fehler.

Meine Frage ist also: Wie kann ich eine JSON-formatierte Zeichenfolge in einem Feld speichern?

Ich kann mehr Informationen bei Bedarf posten.

+2

Um. Um eine json-formatierte Zeichenkette zu speichern, müssen Sie * eine json-formatierte Zeichenkette * übergeben. 'str()' jon-formatiert die Dinge nicht, 'json.dumps' tut das. Dies allein ist nicht Ihr Problem, aber überprüfen Sie den Typ von "Parameter 1" in Ihrer Abfrage, die aussieht wie "kill.get_victim()". –

+0

Danke dafür. Ich habe den Beitrag aktualisiert, um diese Fehler zu korrigieren. Der Fehler gibt jetzt Parameter 4 statt 1 zurück, weil ich Ihren Vorschlag verwendet habe, der das Problem mit Parameter 1 behoben hat. – Cameron

+0

Parameter 4 ist 'kill.get_attackers', was eine Funktion ist, nicht das Ergebnis des Aufrufs der Funktion. –

Antwort

0

So, es scheint, es war ein Tippfehler meinerseits. Für den Tischaufbau gab es eine Reihe von '' die nicht drin sein sollte. Die Tabelle Setup so ausgesehen, wenn man alles auf eine Zeile setzen und nicht zwei Zeilen wie ich es hatte:

cur.execute('create table if not exists KillData(KillID INT, Victim TEXT, Attackers TEXT, Items Text,'' KillTime TEXT, System INT, Price REAL)') 

Also, durch das Entfernen ‚‘ vor KillTime der Fehler nicht mehr passiert, und der Code funktioniert.