Lädt automatisch die SQL-Tabelle durch das Lesen der Daten aus text-Datei
Ich versuche zu schreiben, ein python-Skript wird das laden der Tabellen, die ich erstellt in Python ist es notwendig, mithilfe von SQL und füllen Sie Sie automatisch mit Daten, die aus einer text-Datei. Ich bin fest auf grundlegende Codierung. Ich habe eine Allgemeine Idee, aber ich erhalte Fehler, wenn ich versuchen zu laufen, dieser Ansatz. Erstellt habe ich 2 Tabellen. Ich habe die Datei Lesen. die Datei ist eine Komma getrennte text-Datei ohne Header.
ersten 3 Zeilen der Datei wie folgt aussieht.
+ ---- + ----- + -------------------- + -------- + - + --- + ----- +
| John | Smith | 111 N. Wabash Avenue | plumber | 5 | 1.0 | 200 |
| John | Smith | 111 N. Wabash Avenue | bouncer | 5 | 1.0 | 200 |
| Jane | Doe | 243 S. Wabash Avenue | waitress | 1 | 5.0 | 10000 |
+ ---- + ----- + -------------------- + -------- + - + --- + ----- +
import sqlite3
conn= sqlite3.connect('csc455.db')
c = conn.cursor()
#Reading the data file
fd = open ('C:/Users/nasia/Documents/data_hw2.txt','r')
data = fd.readlines()
#Creating Tables
>>> L = """create table L
... (first text, last text, address text, job text, LNum integer,
... constraint L_pk
... primary key(first, last, address, job),
... constraint L_fk
... foreign key (LNum) references LN(LNum)
... );"""
>>> c.execute(L)
LN = """create table LN
... (
... LNum integer, Interest float, Amount, Integer,
... constraint LN_pk
... primary key (LNum)
... );"""
c.execute(LN)
#Inserting into database
for elt in data:
... currentRow = elt.split(", ")[:-1]
... insert = """(insert into LN values (%s, %s, %s);, %(currentRow[4], currentRow[5], currentRow[6]))"""
... c.execute(insert)
Gibt es einige syntax-Fehler hier. Der code aufhört zu funktionieren. Ich kann nicht herausfinden, was ich falsch mache.
Der Fehler ist
Traceback (most recent call last):
File "", line 4, in
OperationalError: near "(": syntax error
Ich kann nicht herausfinden, was mache ich falsch
- Was bedeutet
data_hw2.txt
Aussehen? Was ist dein Datenbank-schema? Wie wollen Sie die Karte von einem zum anderen? - In der Zukunft, es hilft wirklich, zu wissen, welche Anweisung den Fehler ausgelöst, anstatt uns raten!
- Als seitliche Anmerkung, die Sie nicht haben, um
;
auf einzelne SQL-Anweisungen übergebenexecute
; das ist nur erforderlich, wenn Sie die command-line-tool, oder das ausführen eines SQL-Skripts.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie haben nicht erklärt, in welchem format die Daten sind, oder was Ihre Tabellenstruktur ist bzw. wie Sie möchten, ordnen Sie Sie, was macht dies schwierig zu beantworten. Aber ich werde meinen eigenen, und Antwort, und hoffentlich wird es helfen:
infile.txt:
script.py
Natürlich, wenn Sie Ihre realen Daten in einem anderen format als CSV -, Sie verwenden unterschiedliche code zum Parsen der Eingabedatei.
Hab ich auch gemacht, die Dinge ein wenig komplexer als Ihre realen Daten zu tun haben—die CSV-Spalten haben nicht ganz den gleichen Namen wie die SQL-Spalten.
Andere Wege, Ihre Daten könnten komplexer sein—z.B., wenn Sie Ihre schema hat Fremdschlüssel, Referenz auf eine auto-increment-Zeile-ID anstelle eines Textfeldes, die Sie brauchen, um die rowid nach dem ersten einfügen.
Aber dies sollte genug sein, um Ihnen die Idee.
Nun, dass Sie gezeigt haben, mit mehr details... Sie auf dem richtigen Weg waren (obwohl es verschwenderisch nennen
readlines
anstelle von nur Durchlaufenfd
direkt, und Sie sollten in der Nähe Ihrer db und Datei, idealerweise mitwith
- Anweisung, ...), aber du hast einen einfachen Fehler gleich in der Nähe des Ende, die verhindert, dass Sie immer weiter:Sie haben die Formatierung
%
Ausdruck direkt in den string ein, statt mit dem operator auf string. Ich denke, was Sie versuchen zu tun ist:Aber Sie sollte das nicht tun. Stattdessen, dies zu tun:
Was ist der Unterschied?
Gut, die ersten einfach fügt die Werte in die Anweisung als Python-strings. Das bedeutet, dass Sie kümmern sich um die Konvertierung in das richtige format, zitieren, Flucht, etc. selbst, anstatt dass die Datenbank-engine zu entscheiden, wie man mit jedem Wert. Abgesehen davon, dass eine Quelle von frustrierenden Fehler, wenn Sie versuchen, speichern Sie ein boolescher Wert oder vergessen zu zitieren, eine Zeichenfolge, diese lässt auch Sie offen für SQL-injection Angriffe, es sei denn, Sie sind sehr vorsichtig.
Gibt es andere Probleme, außer, dass man. Zum Beispiel, die meisten Datenbanken werden versuchen, cache wiederholten Erklärungen, und es ist trivial zu sagen, dass die 3000 Instanzen
insert into LN values (?, ?, ?)
sind alle der gleichen Aussage, aber weniger, so zu sagen, dassinsert into LN values (5, 1.0, 200)
undinsert into LN values (1, 5.0, 5000)
sind die gleiche Aussage.Wenn Sie verwenden können standard -
sqlite3
- Dienstprogramm, können Sie es viel einfacher:rufen Sie einfach diese Zeile aus Ihrem python-Skript, und Sie sind fertig.
Lesen beliebigen text-Datei, die enthält eine gültige SQL-Anweisungen, und erstellen "MeineDatenbank".db, wenn es nicht vorhanden ist. Was wichtiger ist, es unterstützt Aussagen über mehr als eine Zeile, und auch richtig, ignoriert SQL-Kommentare mit beiden
--comment
syntax und C/C++ wie/*comment*/
syntax.In der Regel Ihre
mydata.sql
Inhalt sollte wie folgt Aussehen: