Python und pysqlite wollen nicht miteinander

Probleme bei der Installation?
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

Hallo,

ich habe Probleme mit dem Zusammenspiel zwischen pysqlite 2.3.2 (sqlite 3.3.6) und Python 2.4.3 auf Ubuntu 6.04.

Greife ich mit
>>> from pysqlite2 import dbapi2 as sqlite
auf pysqlite zu und führe dann irgendeine Datenbankoperation aus, meldet er mir stets "unsupported file format".
Da der Fehler auftritt, wenn eine ältere Version von (py)sqlite auf eine Datenbank zugreift, die mit einer neueren Version erstellt wurde UND
bei mir noch die Packete python2.4-sqlite bzw python-sqlite (interface to sqlite 2) installiert sind, die ich aufgrund von Abhängigkeiten aber nicht rausschmeissen kann, vermute ich, dass da irgendwas schief läuft und es daran liegt.

Habe leider keine Idee, wie ich das überprüfen bzw. lösen kann, hoffe, dass das hier jemand weiß :idea:


Sebastian
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Format der SQLite Datenbanken wird ab und zu verändert, daher kann es sein, dass dein SQLite einfach zu "neu" ist für die Datenbankdatei.

Aber python-sqlite welches von python2.4-sqlite abhängt ist doch schon in einer verwendbaren Version in Ubuntu. Warum willst du sie deinstallieren?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

Ich erstelle die Datenbanken aber selber :)

z.B. mit:
sqlite3 testdb
create table people(name text, age numeric);

Daran sollte es doch nicht liegen?


Die Packete python-sqlite/python2.4-sqlite sind ein "interface to SQLite 2" (aus der Beschreibung). Deswegen meine Vermutung, dass die noch von Python verwendet werden, da dann wirklich eine ältere Version auf eine DB neueren Formats zugreifen würde.

Ich habe dann zuerst die Sources (sowohl von sqlite als auch von pysqlite) heruntergeladen und kompiliert. Als dann besagter Fehler auftrat, habe ich es auch noch mit apt-get probiert und habe jetzt eben noch das Packet python2-4-pysqlite2 installiert, aber das hat nichts geändert.

Gibt es etwas in der Art von
>>> from pysqlite2 import info
>>> info.info()
Pysqlite version x.xx?
Zuletzt geändert von _Sebastian_ am Montag 3. Juli 2006, 19:57, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du brauchst python-sqlite2 um auf sqlite3 datenbanken zuzugreifen. Installier das am besten über APT und lösch vorher das selbstkompilierte komplett.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

Habe ich getan, hat leider am Fehler nichts geändert.

Habe jetzt folgende Pakete installiert:
python2.4-pysqlite2
python2.4-sqlite
python-pysqlite2
python-sqlite

Merkwürdig?


Edit:
Vielleicht bin ich ja auch auf dem falschen Dampfer? Ich poste mal meinen Code, der den Fehler auslöst, vielleicht hat es ja gar nichts mit den Versionen zu tun. Andererseits ist das fast 1:1 aus dem pysqlite-manual übernommen:

Code: Alles auswählen

from pysqlite2 import dbapi2 as sqlite

con = sqlite.connect("testdb")

cur = con.cursor()

who = "mustermann"
age = 30

cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
print cur.fetchone()
Traceback (most recent call last):
File "dbtest.py", line 10, in ?
cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
pysqlite2.dbapi2.OperationalError: unsupported file format
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

das ist alles komplett korekt!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

_Sebastian_ hat geschrieben:Gibt es etwas in der Art von
>>> from pysqlite2 import info
>>> info.info()
Pysqlite version x.xx?
Hi _Sebastian_!

Ja, so etwas gibt es:

Code: Alles auswählen

>>> from pysqlite2 import dbapi2 as sqlite
>>> sqlite.version
'2.3.2'
>>> sqlite.sqlite_version
'3.3.6'
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Hm, bei mir funktioniert es:

Code: Alles auswählen

$ sqlite3 testdb
SQLite version 3.2.8
Enter ".help" for instructions
sqlite> create table people(name text, age numeric);
Das Python-Programm sieht fast so aus wie Deins, nur das ich `name_last` durch `name` ersetzt habe, damit es zum ``create`` passt:

Code: Alles auswählen

from pysqlite2 import dbapi2 as sqlite

con = sqlite.connect("testdb")

cur = con.cursor()

who = "mustermann"
age = 30

cur.execute("select name, age from people where name=? and age=?", (who, age))
print cur.fetchone()
Ergebnis:

Code: Alles auswählen

$ python test.py
None
Klar, weil keine Werte in der Tabelle stehen. Aber keine Ausnahme. Benutze ebenfalls Dapper und habe alle Pakete aus dem Repository und nichts davon selbst übersetzt.

Es könnten also noch irgendwelche Überreste von der selbst übersetzten Bibliothek schuld sein.
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

Hmmm

Code: Alles auswählen

>>> from pysqlite2 import dbapi2 as sqlite
>>> sqlite.version
'2.0.5'
>>> sqlite.sqlite_version
'3.2.8'
Nicht unbedingt die allerneuersten Versionen.

Blackjack, bzgl. der Überreste - ich habe schon alles rausgelöscht, soweit ich das überblicken kann. Das Buildverzeichnis und /usr/lib/ und /usr/include bereinigt.
Habe auch schon alle Pakete, die mit sqlite zusammenhängen, nochmals installiert (diesmal allerdings mit apt), das hat auch nichts gebracht.

*ratlos*

Der Test funktioniert übrigens ebenfalls nicht
>>> from pysqlite2 import test
>>> test.test()
.........................................................E................EEEFE..............FE......FEF......FFE..................FFFFFFEE...EEEEEE...........EEEEFESegmentation fault
Der ist allerdings wohl nicht so aussagekräftig, ich habe da schon mal deswegen in der pysqlite-Mailliste nachgefragt, der Test schlägt aufgrund von Bugs manchmal fehl, auch wenn alles funktioniert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kannst ja mal schauen, ob der PySQLite-Pfad bei dir der gleiche ist wie bei mir (sollte es, wenn du über APT installiert hast):

Code: Alles auswählen

In [1]: from pysqlite2 import dbapi2 as sqlite

In [2]: sqlite.__file__
Out[2]: '/usr/lib/python2.4/site-packages/pysqlite2/dbapi2.pyc'
@BlackJack: Gibt es bei IPython eine Option, die das zusätzliche Newline bei In[1] nicht ausgibt, sondern eher wie der normale Interpreter funktioniert? Ich konnte in der Dokumentation irgendwie nichts finden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

_Sebastian_ hat geschrieben:Blackjack, bzgl. der Überreste - ich habe schon alles rausgelöscht, soweit ich das überblicken kann. Das Buildverzeichnis und /usr/lib/ und /usr/include bereinigt.
Habe auch schon alle Pakete, die mit sqlite zusammenhängen, nochmals installiert (diesmal allerdings mit apt), das hat auch nichts gebracht.

*ratlos*

Der Test funktioniert übrigens ebenfalls nicht
>>> from pysqlite2 import test
>>> test.test()
.........................................................E................EEEFE..............FE......FEF......FFE..................FFFFFFEE...EEEEEE...........EEEEFESegmentation fault
Wo hast Du diesen Test her? Bei mir gibt's den nicht! Hast Du auch das Python-Binding selbst gebaut?
BlackJack

Leonidas hat geschrieben:@BlackJack: Gibt es bei IPython eine Option, die das zusätzliche Newline bei In[1] nicht ausgibt, sondern eher wie der normale Interpreter funktioniert? Ich konnte in der Dokumentation irgendwie nichts finden.
In `~/.ipython/ipythonrc` steht bei mir folgendes:

Code: Alles auswählen

# The structure of prompt printing is:
# (SeparateIn)Input....
# (SeparateOut)Output...
# (SeparateOut2),   # that is, no newline is printed after Out2
# By choosing these you can organize your output any way you want.

separate_in \n
separate_out 0
separate_out2 0
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Toll! Danke, wenn man separate_in auf 0 setzt, macht es genau das was ich will. Wieder was gelernt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

BlackJack hat geschrieben:Wo hast Du diesen Test her? Bei mir gibt's den nicht! Hast Du auch das Python-Binding selbst gebaut?
Ich hätte gedacht, dass der standardmäßig dabei wäre:
http://initd.org/pub/software/pysqlite/ ... ource.html
Steht bei Step 4.

@Leonidas
Der Pfad ist ganz genau der gleiche bei mir, daran liegts wohl auch nicht.
BlackJack

_Sebastian_ hat geschrieben:
BlackJack hat geschrieben:Wo hast Du diesen Test her? Bei mir gibt's den nicht! Hast Du auch das Python-Binding selbst gebaut?
Ich hätte gedacht, dass der standardmäßig dabei wäre:
http://initd.org/pub/software/pysqlite/ ... ource.html
Steht bei Step 4.
Wenn Du das aus den Quellen installierst, dann gibt es diesen Test, aber im pysqlite2 Paket ist der nicht enthalten. Also wo hast Du ihn her!?

Code: Alles auswählen

$ dpkg -L python2.4-pysqlite2
/.
/usr
/usr/lib
/usr/lib/python2.4
/usr/lib/python2.4/site-packages
/usr/lib/python2.4/site-packages/pysqlite2
/usr/lib/python2.4/site-packages/pysqlite2/__init__.py
/usr/lib/python2.4/site-packages/pysqlite2/dbapi2.py
/usr/lib/python2.4/site-packages/pysqlite2/_sqlite.so
/usr/share
/usr/share/doc
/usr/share/doc/python2.4-pysqlite2
/usr/share/doc/python2.4-pysqlite2/usage-guide.html
/usr/share/doc/python2.4-pysqlite2/default.css
/usr/share/doc/python2.4-pysqlite2/docutils.css
/usr/share/doc/python2.4-pysqlite2/silvercity.css
/usr/share/doc/python2.4-pysqlite2/README.Debian
/usr/share/doc/python2.4-pysqlite2/copyright
/usr/share/doc/python2.4-pysqlite2/examples
/usr/share/doc/python2.4-pysqlite2/examples/adapter_datetime.py
/usr/share/doc/python2.4-pysqlite2/examples/adapter_point_1.py
/usr/share/doc/python2.4-pysqlite2/examples/adapter_point_2.py
/usr/share/doc/python2.4-pysqlite2/examples/connect_db_1.py
/usr/share/doc/python2.4-pysqlite2/examples/connect_db_2.py
/usr/share/doc/python2.4-pysqlite2/examples/converter_point.py
/usr/share/doc/python2.4-pysqlite2/examples/countcursors.py
/usr/share/doc/python2.4-pysqlite2/examples/createdb.py
/usr/share/doc/python2.4-pysqlite2/examples/execsql_fetchonerow.py
/usr/share/doc/python2.4-pysqlite2/examples/execsql_printall_1.py
/usr/share/doc/python2.4-pysqlite2/examples/execute_1.py
/usr/share/doc/python2.4-pysqlite2/examples/execute_2.py
/usr/share/doc/python2.4-pysqlite2/examples/execute_3.py
/usr/share/doc/python2.4-pysqlite2/examples/executemany_1.py
/usr/share/doc/python2.4-pysqlite2/examples/executemany_2.py
/usr/share/doc/python2.4-pysqlite2/examples/executescript.py
/usr/share/doc/python2.4-pysqlite2/examples/insert_more_people.py
/usr/share/doc/python2.4-pysqlite2/examples/md5func.py
/usr/share/doc/python2.4-pysqlite2/examples/mysumaggr.py
/usr/share/doc/python2.4-pysqlite2/examples/parse_colnames.py
/usr/share/doc/python2.4-pysqlite2/examples/pysqlite_datetime.py
/usr/share/doc/python2.4-pysqlite2/examples/row_factory.py
/usr/share/doc/python2.4-pysqlite2/examples/simple_tableprinter.py
/usr/share/doc/python2.4-pysqlite2/usage-guide.txt.gz
/usr/share/doc/python2.4-pysqlite2/changelog.Debian.gz
/usr/share/doc-base
/usr/share/doc-base/python2.4-pysqlite2
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

Das listet bei mir ganz genau das gleiche auf.

Ich habe anscheinend doch noch nicht alle Reste von den selbstgebauten sqlite/pysqlite-Versionen gelöscht. Wie kann ich denn sicherstellen, dass ich alles gelöscht habe? Bzw. woher weiß ich, was wo hinkopiert wurde?
BlackJack

Die setup.py Skripte sind beim Installieren normalerweise recht "redseelig". Ist zwar nicht die schönste Variante, aber nochmal installieren und schauen wo was hin kopiert wird, hilft vielleicht.

Hast Du das eigene `pysqlite2` über ein bereits installiertes Paket gebügelt? Dann reicht es vielleicht schon das Paket nochmal zu installieren.
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

Ja, ich habe über ein bestehendes Paket installiert. Aber das Paket habe ich mittlerweile öfter vollständig entfernt, neu runtergeladen, und drüberinstalliert (per apt-get), als ich zählen kann.

Der interessante Part der Ausgabe von setup.py ist
copying build/lib.linux-i686-2.4/pysqlite2/__init__.py -> /usr/lib/python2.4/site-packages/pysqlite2
copying build/lib.linux-i686-2.4/pysqlite2/dbapi2.py -> /usr/lib/python2.4/site-packages/pysqlite2
copying build/lib.linux-i686-2.4/pysqlite2/test/__init__.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
copying build/lib.linux-i686-2.4/pysqlite2/test/dbapi.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
copying build/lib.linux-i686-2.4/pysqlite2/test/factory.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
copying build/lib.linux-i686-2.4/pysqlite2/test/hooks.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
copying build/lib.linux-i686-2.4/pysqlite2/test/regression.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
copying build/lib.linux-i686-2.4/pysqlite2/test/transactions.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
copying build/lib.linux-i686-2.4/pysqlite2/test/types.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
copying build/lib.linux-i686-2.4/pysqlite2/test/userfunctions.py -> /usr/lib/python2.4/site-packages/pysqlite2/test
Es ist also alles in /usr/lib/python2.4/site-packages/pysqlite2 und wenn ich da ein rm -r pysqlite2 setze und das Paket nochmal drüberinstalliere, tut sich bei der Fehlermeldung leider gar nichts.
BlackJack

Es müsste da irgendwo noch eine `_sqlite.so` geben. Vielleicht hast Du davon noch eine "falsche" irgendwo rumliegen!?
_Sebastian_
User
Beiträge: 21
Registriert: Sonntag 16. April 2006, 12:48

Ja, die ist auch in /pysqlite2, die habe ich allerdings ebenfalls gelöscht. Nachdem ich dann python-pysqlite2 wieder installiert habe, war sie wieder, da, sollte also die richtige Version sein.

ldd _sqlite.so ergibt
linux-gate.so.1 => (0xffffe000)
libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0xb7ecf000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7ebd000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d8e000)
/lib/ld-linux.so.2 (0x80000000)

Kann es an /usr/lib/libsqlite3.so.0 liegen?
Antworten