sqlite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Montag 5. Juni 2006, 00:30

ich habe mir sqlite ausführlich agesehen und muss leider sagen, dass ich da ein prblem habe. Wenn ich den Skript da unten ausführe, bekomme ich den gehler, dass die tabelle leer sei. sie ist auch 0 byte groß.
aber wieso?
das ist aus einem beispiel kopiert, habe auch schon ein anderes angesehen und ausprobiert...

Code: Alles auswählen

#!/usr/bin/env python
import sqlite
db = sqlite.connect("test.db")
cursor = db.cursor()
conn()    
cursor.execute("CREATE TABLE t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);")
cursor.execute("insert into t1 (data,num) values ('This is sample data',3);")
db.close
conn()
print cursor.execute("SELECT * FROM t1;")
db.close()
#!/usr/bin/env python
import sqlite
def conn():
global db, cursor
db = sqlite.connect("test.db")
cursor = db.cursor()
conn()
cursor.execute("CREATE TABLE t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);")
cursor.execute("insert into t1 (data,num) values ('This is sample data',3);")
db.close
conn()
print cursor.execute("SELECT * FROM t1;")
db.close()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 5. Juni 2006, 09:18

murph hat geschrieben:bekomme ich den gehler, dass die tabelle leer sei. sie ist auch 0 byte groß. aber wieso?
Hi murph!

SQLite ist so eingestellt, dass es NICHT automatisch einen Commit durchführt. Warum? Weil es dadurch schneller und sicherer ist.

Irgendwo habe ich diese, sinngemäß (aus dem Gedächtnis) übersetzte, Aussage gelesen:
"Wenn du möchtest, dass SQLite langsam ist, dann schalte AutoCommit ein."

Die Lösung:
Nachdem du Daten per SQL-Anweisung in die Datenbank geschrieben hast, musst du ein

Code: Alles auswählen

conn.commit()
nachschieben.

Außerdem, würde ich mir das neueste pySQLite besorgen: http://initd.org/tracker/pysqlite#Downloads

Code: Alles auswählen

import os
try:
    import sqlite3 # Ab Python 2.5
except:
    from pysqlite2 import dbapi2 as sqlite3

#
# Schreiben
#

# Nur zum Testen: Alte Datei vorher loeschen
try:
    os.remove("dateiname.sqlite")
except:
    pass

# Verbindung herstellen
conn = sqlite3.connect("dateiname.sqlite")
cur = conn.cursor()

# Tabelle erstellen
sql = """
CREATE TABLE adressen (
  first_name varchar,
  last_name varchar,
  age int
)
"""
cur.execute(sql)
conn.commit()

# Werte in die Tabelle schreiben
personen = [
    {"first_name": "Gerold", "last_name": "Penz", "age": "31"},
    {"first_name": "Ludwig", "last_name": "Bucher", "age": "29"},
]
sql = """
INSERT INTO adressen (
    first_name,
    last_name,
    age
)
VALUES (
    :first_name,
    :last_name,
    :age
)
"""
cur.executemany(sql, personen)
conn.commit()

# Verbindung schliessen
cur.close()
conn.close()

#
# Lesen
#

# Verbindung herstellen
conn = sqlite3.connect("dateiname.sqlite")
cur = conn.cursor()

sql = """
SELECT
    first_name, last_name, age
FROM
    adressen
"""
cur.execute(sql)
rows = cur.fetchall()

for row in rows:
    vorname, nachname, alter = row
    print "Datensatz:", row
    print "Vorname:  ", vorname, "==>", type(vorname)
    print "Nachname: ", nachname, "==>", type(nachname)
    print "Alter:    ", alter, "==>", type(alter)
    print

# Verbindung schliessen
cur.close()
conn.close()
Wenn du wissen willst, wie das mit dem AutoCommit funktioniert, dann schau mal hier rein: http://www.python-forum.de/topic-6157.html

Außerdem gibt es bereits eine recht gute Hilfe zum neuen SQLite: http://docs.python.org/dev/lib/module-sqlite3.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Montag 5. Juni 2006, 10:25

achso...hatte alte versionen gelesen und da stand das nicht drin, sodass ich dachte, dass er wie bei textdateien beim schließen automatisch ein commit() druchführt. aber ich werde mir dann auch mal die neue version holen.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Montag 5. Juni 2006, 18:17

Ich habe es mit einer Version versucht
murph@murphs:~$ python
Python 2.4.2 (#2, Sep 30 2005, 21:19:01)
[GCC 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pysqlite2 import dbapi2 as sqlite3
>>> conn = sqlite3.connect("test.db")
>>> cur = conn.cursor
>>> sql = """
... CREATE TABLE adressen(
... first_name varchar,
... last_name varchar,
... age int
... )
... """
>>> cur.execute(sql)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'builtin_function_or_method' object has no attribute 'execute'
>>> dir(cur)
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__str__']
Dachte mir, dass das für dich interessant sein könnte!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 5. Juni 2006, 21:33

murph hat geschrieben:

Code: Alles auswählen

>>> from pysqlite2 import dbapi2 as sqlite3
>>> conn = sqlite3.connect("test.db")
>>> cur = conn.cursor
Hi murph!

In der letzten Zeile liegt der Hase begraben.

Code: Alles auswählen

cur = conn.cursor()
mfg
Gerold
:-)

PS: Diesen Fehler machst du öfter. Darauf musst du besonders achten.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten