brauche Hilfe bei SQLite..

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

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)
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Code: Alles auswählen

werte = ("Muster", "Musterstrasse", "11")
sql = "INSERT INTO lieferanten VALUES (?, ?, ?)" 
cursor.execute(sql, werte)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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]
Zuletzt geändert von Andy am Samstag 5. Januar 2008, 19:34, insgesamt 1-mal geändert.
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
BlackJack

Vermutung: Das `commit()` auf der Verbindung nach dem Eintragen vergessen!?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du hast das ``.commit()`` vergessen. Sonst werden die Daten nicht dauerhaft abgespeichert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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?
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.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Hey das mit Tupel hat mir schon geholfen, denn wenn ich einzelne Tupel anspreche dann kommen die Daten richtig raus.
Antworten