Seite 1 von 2
brauche Hilfe bei SQLite..
Verfasst: Samstag 5. Januar 2008, 13:11
von bankkind
Hallo Leute,
Ich brauche Hilfe bei SQLite, ich glaube ich stell mich zu doof an!
Ich habe es jetzt schon erfolgreich geschafft eine Tabelle zu erstellen und auch Daten einzugeben.
Jetzt will ich aber der Tabelle die Daten aus Variablen eingeben, leider funktioniert das nciht so wie ich das will.
Um einen kleinen Überblick zu geben schreibe ich mal wie es aussehen soll:
Code: Alles auswählen
cursor.execute(INSERT INTO tbl_todo VALUES(titel ,date,text)''')
Wobei titel, date und text die Variablen darstellen
wie schaffe ich es jetzt diese eizugeben?
Wo ich gerade dabei bin, hätte ich noch eine andere Frage:
In welchem Format das Datum in Datenbanken gespeichert wird, weiß ich ungefähr(!?)... aber wie schaffe ich dieses in die DB zu kriegen?
Ich würde mich freuen wenn ihr mir helfen könntet
Verfasst: Samstag 5. Januar 2008, 13:24
von Hobbes Hobson
Zu deiner ersten Frage hilft dir sicher das hier:
http://www.python-forum.de/topic-6157.html
oder auch gleich so:
Code: Alles auswählen
sql = '''
INSERT INTO serverlogs(
date,
time,
dedonde,
type,
description
) VALUES (
?, ?, ?, ?, ?
)
'''
for zeile in datas:
conn.execute(sql,zeile)
Verfasst: Samstag 5. Januar 2008, 13:32
von Andy
Code: Alles auswählen
werte = ("Muster", "Musterstrasse", "11")
sql = "INSERT INTO lieferanten VALUES (?, ?, ?)"
cursor.execute(sql, werte)
Re: brauche Hilfe bei SQLite..
Verfasst: Samstag 5. Januar 2008, 13:36
von sma
Bankkind, schreibe in deinem
SQL-Statement dort, wo ein Wert stehen soll, ein Fragezeichen und übergibt dann deine Daten in den
execute-Statement.
Code: Alles auswählen
connection.execute("insert into todo (text, done) values (?, ?)", ('SQL lernen', False))
Stefan
Verfasst: Samstag 5. Januar 2008, 16:03
von Hyperion
Auch wenns leicht off-topic ist, aber was spricht gegen:
Code: Alles auswählen
bar = "Hallo Welt"
connection.execute("insert into foo values ('%s')" % bar)
Habe das bei meinen DB-Zugriffen immer so gelöst (allerdings mysql und postgres - wobei das ja eigentlich dank pydb-Api keine Rolle spielen sollte).
Würde gerne mal erfahren, ob das ein oder andere einen Vorteil hat

Verfasst: Samstag 5. Januar 2008, 16:16
von sma
Nimm mal "hallo Welt" den folgenden String:
Code: Alles auswählen
"'); delete from foo; --"[code]
Will sagen, wenn dein String ein "'" enthält, können Dinge furchtbar schief laufen. Desweiteren verstehen einige Datenbank auf komplexere Datentypen als nur Strings, Zahlen oder Zeiten und Daten. Da geht's dann gar nicht mehr ohne Parameter.
Stefan
Verfasst: Samstag 5. Januar 2008, 18:34
von Andy
Und unter Umständen ist es möglich, eine Abfrage so zu manipulieren, dass wieder gültiger SQL-Code dabei herauskommt.
Dadurch wird Dein Programm also verwundbar. Bei solch einen Angriff spricht man auch von SQL Injection.
Gruss Andy
Verfasst: Samstag 5. Januar 2008, 18:42
von Hyperion
Andy hat geschrieben:Und unter Umständen ist es möglich, eine Abfrage so zu manipulieren, dass wieder gültiger SQL-Code dabei herauskommt.
Dadurch wird Dein Programm also verwundbar. Bei solch einen Angriff spricht man auch von SQL Injection.
Gruss Andy
Ja, danke diese Schadtechnik kannte ich schon. Wäre aber nur dann tragisch, wenn es sich um Usereingaben handelt.
Hab mich mal ein wenig schlau gelesen und werd das sicher in Zukunft nicht mehr machen, sondern die Parametermethode verwenden.
Was ich mich jedoch frage ist: Wieso funktioniert das Templating - so will ich das mal nennen - bei SQLite und MySQl anders? Ich meine die pydb-API soll doch eigentlich sicherstellen, dass man (möglichst) DB unabhängig Code schreiben kann.
Nur bei der Pramaterübergabe muss ich ja meinen SQL-Code ändern! genau das ist doch imho eigentlich nicht besonder erwünscht?
Verfasst: Samstag 5. Januar 2008, 19:23
von Andy
Hyperion hat geschrieben:Was ich mich jedoch frage ist: Wieso funktioniert das Templating - so will ich das mal nennen - bei SQLite und MySQl anders? Ich meine die pydb-API soll doch eigentlich sicherstellen, dass man (möglichst) DB unabhängig Code schreiben kann.
Frag´ich mich auch.:K Kann uns bestimmt jemand hier erklären.
Aber mir viel noch etwas auf:
Hyperion hat geschrieben:Code: Alles auswählen
bar = "Hallo Welt"
connection.execute("insert into foo values ('%s')" % bar)
Mit % bar übernimmst Du das escaping, während die .execute-Methode so etwas von sich aus macht.
Code: Alles auswählen
bar = "Hallo Welt"
connection.execute("insert into foo values (%s)" , bar)
So überlässt Du es vollständig der .execute-Methode.
EDIT: Danke an BlackJack - hab´s verbessert[/b]
Verfasst: Samstag 5. Januar 2008, 19:27
von BlackJack
Das mit den Platzhaltern ist halt wie bei SQL: Verschiedene Anbieter implementieren etwas auf unterschiedliche Art und Weise und am Ende wird so gut wie *alles* standardisiert. Ist ja nun nicht so, das man SQL selber von einer Datenbank zur nächsten einfach so mitnehmen kann. Das funktioniert nur in den einfacheren Fällen.
@Andy: Beim zweiten Beispiel sind die einfachen Anführungsstriche um's %s noch zu viel.
Verfasst: Samstag 5. Januar 2008, 19:27
von Leonidas
Habe ich schon erwähnt dass es ORMs wie SQLAlchemy oder Storm gibt?
Dann erledigt sich auch das Problem mit dem Templating, weil man nicht mit SQL in Kontakt treten muss, wenn man es nicht will. Als Anwendungsentwickler will ich Daten, nicht SQL. Daher ein ORM.
Verfasst: Samstag 5. Januar 2008, 19:40
von Hyperion
Leonidas hat geschrieben:Habe ich schon erwähnt dass es ORMs wie SQLAlchemy oder Storm gibt?
Hier noch nicht - aber ist mir durchaus bekannt
Dann erledigt sich auch das Problem mit dem Templating, weil man nicht mit SQL in Kontakt treten muss, wenn man es nicht will. Als Anwendungsentwickler will ich Daten, nicht SQL. Daher ein ORM.
Ich würde dazu gerne eine Position vertreten, aber ich habe mich bisher nur einmal sehr kurz mit SQLAlchemy befasst. Daher kann ich ehrlich gesagt noch nicht abschätzen, inwiefern das genial oder umständlich ist. Ich vermute es kommt da doch auf den Anwendungszweck an. Will ich auf großen DBs komplizierte Batch-Operationen durchführen, könnte ich mir vorstellen, dass natives SQL da die bessere Wahl sein könnte.
Brauche dringend mal ein Projekt, um mich in SQLAlchemie einzuarbeiten
@BlackJack: Ja, sicher. Aber da das ja Python-Libs sind, hätte ich dann schon gedacht, dass man da bei so einer Sache konformer ist. Weiß jemand was da bei anderen DBs gängig ist? Klar kann man nicht alles standardisieren! Ich mag es nur nicht so sehr, wenn ich mich da umgewöhnen muss ... jaja, jetzt kann Leonidas mit dem ORM-Hammer kommen

Verfasst: Samstag 5. Januar 2008, 20:27
von Leonidas
Hyperion hat geschrieben:Ich würde dazu gerne eine Position vertreten, aber ich habe mich bisher nur einmal sehr kurz mit SQLAlchemy befasst. Daher kann ich ehrlich gesagt noch nicht abschätzen, inwiefern das genial oder umständlich ist. Ich vermute es kommt da doch auf den Anwendungszweck an. Will ich auf großen DBs komplizierte Batch-Operationen durchführen, könnte ich mir vorstellen, dass natives SQL da die bessere Wahl sein könnte.
Hmm, naja. Wenn wir von Storm oder Django sprechen würden - ja, möglicherweise. Aber SQLAlchemy hat eben sehr viele, ziemlich mächtige Möglichkeiten die mit purem SQL zwar auch möglich sind, nur wozu? SQLAlchemy ist ein überaus umfangreiches ORM, mit Möglichkeiten die ich sicherlich niemals alle nutzen werde. Insofern eignet es sich gerade für komplizierte Operationen. Für ganz einfache Sachen ist es hingegen etwas Overkill. Da würde dann ein Active Record-like ORM wie Storm oder was auch immer anderes zu schnelleren Erfolgen führen.
Verfasst: Samstag 5. Januar 2008, 21:17
von bankkind
Danke für die vielen Antworten, hat mir echt geholfen!
Allerdings bin ich mir nicht sicher ob ich mit folgendem Code, die Daten in die tabelle bekommen habe:
Code: Alles auswählen
t = (titel,date,text)
cursor.execute('''INSERT INTO tbl_todo(Titel_Eintrag,Datum_Eintrag,Eintrag) VALUES(?,?,?)''', t)
denn wenn ich die Daten jetzt mit:
Code: Alles auswählen
cursor.execute('''SELECT * FROM tbl_todo''')
show = cursor.fetchall()
auslesen will erscheint auf dem Bildschirm nur: []
Also jetzt ist noch irgendwo der wurm drin, entweder beim einlesen oder beim ausgeben... könnt ihr mir nochmal helfen?
Verfasst: Samstag 5. Januar 2008, 21:58
von Hyperion
Sieht offensichtlich so aus, dass es nicht geklappt hat - wobei ich da jetzt keinen Fehler sehe (ok, der Code ist ja auch nicht vollständig).
Es gibt doch bestimmt irgend ne grafische Shell für SQLite? Also für KDE kenne ich ja eine, wie sieht's mit Squirrel aus? Hab gra nicht im Kopf, ob der auch SQLite kann ... würds aber mal stark vermuten. Damit kannst Du dann einfach gucken, ob Daten drin sind. Außerdem natürlich Daten reinschreiben und dann damit das Auslesen testen.
Verfasst: Samstag 5. Januar 2008, 22:06
von BlackJack
Vermutung: Das `commit()` auf der Verbindung nach dem Eintragen vergessen!?
Verfasst: Samstag 5. Januar 2008, 22:20
von Leonidas
Du hast das ``.commit()`` vergessen. Sonst werden die Daten nicht dauerhaft abgespeichert.
Verfasst: Sonntag 6. Januar 2008, 10:05
von bankkind
hmmmm....ja OK
aber wenn ich jetzt cursor.commit() nach der eingabe der Daten schreibe bekomme ich immer eine Fehlermeldung:
Sqlite.cursor object has no attribute 'commit'
EDIT: Nach ein wenig rumspielen habe ich es doch geschafft! Danke
Jetzt werden mir die Daten aber ziemlich unstruckturiert ausgegeben...Wie bekomme ich vor den Strings dieses
u' weg?
wie kann ich die Daten jetzt vor der Ausgabe selbst strukturieren?
Verfasst: Sonntag 6. Januar 2008, 11:45
von BlackJack
Du bekommst die Daten als Tupel zurück, dass würde ich nicht gerade unstrukturiert nennen. Und das u zeigt, dass es sich um Unicode-Zeichenketten handelt. Wenn Du das wegbekommen möchtest, musst Du sie irgendwie kodieren. Such dazu mal im Forum und/oder Wiki nach Unicode. Das sollte man auf jeden Fall verstanden haben.
Verfasst: Sonntag 6. Januar 2008, 15:00
von bankkind
Hey das mit Tupel hat mir schon geholfen, denn wenn ich einzelne Tupel anspreche dann kommen die Daten richtig raus.