Erfahrungsbericht eines Unerfahrenen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
ElSids
User
Beiträge: 16
Registriert: Montag 25. Juni 2007, 13:15
Wohnort: Corciano/Italien

wie aus dem Titel hervorgeht, besitze ich nur wenig Programmiererfahrung.

Deshalb schien mir python wegen sein Einfachheit und Vielfalt sehr geeignet meine Programmierkenntnisse zu vertiefen.
Erste Ahnungen überfielen mich, als ich eben jene "Vielfalt" sah. Ein chaotischer Dschungle mit vielen Fantasynamen (immerhin beginnen sie alle mit py...). Oder auch eine Wüste, wo man nicht mehr weiß, wo Norden und Süden ist.

Nun gut, also begann ich mich langsam vortastend in Richtung Datenbank zu bewegen. Etwas, was Üben mit nützlichen Ergebnissen verband.
Entwicklung: python (Listen, Dictionaries, pickle), sqlite3, pysqlite, sqlalchemy, sqlobject - aus. ("Große" Datenbanken habe ich von vorneherein ausgeschlossen)

Die Möglichkeiten von python habe ich verstanden, wenn auch noch nicht ganz ausgeschöpft, dank vieler tutorials und Literatur. In Sqlite3 fühle ich mich langsam ganz wohl, dank einiger Tutorials und dank etwas Literatur.
In pysqlte kann ich immerhin eine Datenbank anlegen und sogar Daten wiederfinden, nachdem die Finger bluten vor vielem INSERT TO usw. eintippsen. (Sagt, gibts eigentlich eine Hilfe, wie ich die Datenein/ausgabe mit einer Gui bewerkstelligen kann, oder verwaltet ihr die Datenbanken tatsächlich über die IDLE ?)

Sqlalchemy :
The installed version of sqlite (3.3.10) is out-dated, and will cause errors in some cases. Version 3.3.13 or greater is recommended.
Recherchen im Internet ergaben in irgenteiner Mailing-list, dass es noch zwei, drei andere gibt mit gleichem Problem (glaub ich nicht, alle anderen haben sqlalchemy gleich gelöscht). Der Fehler liegt übrigens in der dbapi2.0/ pysqlite und ich habe bereits zuviel Zeit verloren mit dem Abtippen von sog. Tutorials, die alle das gleiche zeigen und nur von der Dokumentation kopiert, etwas geändert und gleich wieder als Neues Tutorial ausgespuckt werden. (installiert sqlite3.3.17)

Sqlobject:
Examples are good. Examples give a feel for the aesthetic of the API, which matters to me a great deal
... - 20 Zeilen examples und ein paar Schnippsel gaben mir tatsächlich a feel of the asthetics. Ich kann eine Datenbank anlegen, Daten eingeben, bekomme sie aber nicht wieder heraus - mein verzweifelter Code sagt, kein Zugriff ...
Gibt es eigentlich ein Tutorial darüber, wie man Tutorials/Dokumentationen schreiben sollte und wie nicht?

Sicherlich ist dieser Beitrag kritisch, jedoch kann ich versichern, dass ich allen Respekt vor jenen erfahren Genies habe, die solche Programme, zudem umsonst, entwickeln und umsetzen. Hochachtung vor Helfern, die freiwillig ihre Zeit opfern, um solchen Greenhorns wie mir Dinge zu erklären, die einfach sind, aber schwierig zu verstehen.

Ich hoffe, euch mit diesem Erfahrungsbericht nicht zu sehr strapaziert zu haben

Lothar
BlackJack

Für grafischen Zugang zu Datenbanken benutze ich gewöhnlich die entsprechenden Programme für die spezifische Datenbank. Oder auch mal das jeweilige Kommandozeilenprogramm für die Datenbank.

Das Problem bei SqlAlchemy dürfte einfach der Test sein. Entweder wird auf die Versionsnummer oder eine bestimmte Eigenschaft getestet und dabei passiert ein Fehler.

Welchen Quelltext hast Du denn ausprobiert? Da Beispiel unter dem Zitat über gute Beispiele funktioniert bei mir:

Code: Alles auswählen

In [17]: from sqlobject import *

In [18]: sqlhub.processConnection = connectionForURI('sqlite:/:memory:')

In [19]: class Person(SQLObject):
   ....:     fname = StringCol()
   ....:     mi = StringCol(length=1, default=None)
   ....:     lname = StringCol()
   ....:

In [20]: Person.createTable()

In [21]: p = Person(fname="John", lname="Doe")

In [22]: p
Out[22]: <Person 1 fname='John' mi=None lname='Doe'>

In [23]: p.fname
Out[23]: 'John'

In [24]: p.mi = 'Q'

In [25]: p2 = Person.get(1)

In [26]: p2
Out[26]: <Person 1 fname='John' mi='Q' lname='Doe'>

In [27]: p is p2
Out[27]: True
Ich würde auch nicht unbedingt sagen, dass relationale Datenbanken eine einfache Sache sind.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich nutze meist MySQL (MySQLdb ist auf SF.net zu finden) und zum verwalten PHPMyAdmin. Seit neustem (weil ich mich mit Django beschäftige) nutze ich auch SQLAlchemy um auf die MySQL Datenbank zuzugreifen. Auch damit bin ich sehr zufrieden.

SQLLite nutze ich auch sehr gerne, ist eine der schönsten Neuerungen in Python 2.5. Einen GUI Editor gibt es auch dafür: http://www.python-forum.de/topic-10008.html
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sr4l hat geschrieben:Einen GUI Editor gibt es auch dafür: http://www.python-forum.de/topic-10008.html
Hallo!

Leider kann der "SQLite-Admin" nicht korrekt mit Umlauten umgehen. Er schreibt nicht (wie vom Erfinder vorgesehen) Texte in der UTF-8-Kodierung in die Datenbank. Aber ansonsten, ein nettes Tool.

Es gibt aber auch noch andere Datenbank-IDEs:
http://www.sqlite.org/cvstrac/wiki?p=ManagementTools

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
The installed version of sqlite (3.3.10) is out-dated, and will cause errors in some cases. Version 3.3.13 or greater is recommended.
installiere dir einfach die neuste SQLite3 Version, dann müsste es eigentlich fehlerfrei laufen.

Gruss
pyStyler
Zuletzt geändert von pyStyler am Montag 25. Juni 2007, 22:58, insgesamt 1-mal geändert.
BlackJack

Wenn man wie der OP sqlite 3.3.17 installiert hat, dann sollte diese Meldung nicht kommen dürfen. Wenn so eine Meldung kommt, obwohl man eine neuere Version als die dort empfohlene, benutzt, dann ist da irgendwo ein Fehler.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
ein beispiel mit einer Mini-Gui

# Datenbank erstellen

Code: Alles auswählen

# datenbank_erstellen.py
import sqlite3

SQL_CREATEA_TABLE = """
                    CREATE TABLE person(
                    id INTEGER PRIMARY KEY,
                    name TEXT,
                    vorname TEXT)
                    """
_connect = sqlite3.connect( 'meineDB2.db' )
_cursor = _connect.cursor()

_cursor.execute( SQL_CREATEA_TABLE )
_connect.commit()

_cursor.close()
_connect.close()
# datenbank befüllen

Code: Alles auswählen

 # mini_gui.py
import Tkinter 
import sqlite3

SQL_INSERT_INTO = """ 
            INSERT INTO person (name, vorname)
            VALUES (:name,:vorname)
            """

def insertSQLiteQuery(name, vorname):
    conn = sqlite3.connect(r"meineDB2.db") 
    cur =  conn.cursor()
    person = [{'name':name, 'vorname':vorname}]
    cur.executemany(SQL_INSERT_INTO, person)
    conn.commit()
    
def getData():
    name_entry_get = nameEntry.get()
    vorname_entry_get = vornameEntry.get()
    insertSQLiteQuery( name_entry_get, vorname_entry_get )
 
root = Tkinter.Tk()

nameLabel = Tkinter.Label(root, text='Name')
vornameLabel = Tkinter.Label(root, text='Vorname')

nameEntry = Tkinter.Entry(root)
vornameEntry = Tkinter.Entry(root)

speichernButton = Tkinter.Button(root, text='speichern', command=getData)

nameLabel.grid(row=0, column=0)
vornameLabel.grid(row=1, column=0)

nameEntry.grid(row=0, column=1)
vornameEntry.grid(row=1, column=1)

speichernButton.grid(row=2, column=0, padx=5, pady=5)

root.mainloop()
Mit Python ist eben alles einfach.

Gruss
pyStyler
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

pyStyler hat geschrieben:installiere dir einfach die neuste SQLite3 Version
Hi!

Ich werfe hier einfach mal ein, dass SQLite direkt in das Schnittstellenmodul "pysqlite" eingebaut (kompiliert) ist und dass man nur zum Kompilieren SQLite braucht. Es wird, zumindest mal unter Windows, keinen Unterschied geben. Ganz egal, was für ein SQLite man installiert hat. Wichtig ist, welche Version von pySQLite installiert ist.

In Python 2.5.1 (Windows) ist SQLite 3.3.4 einkompiliert.
Das neueste pySQLite http://www.initd.org/tracker/pysqlite/wiki/pysqlite stellt SQLite in der Version 3.4.0 zur Verfügung.

Code: Alles auswählen

>>> import sqlite3
>>> sqlite3.sqlite_version # In Python 2.5.1 eingebaut
'3.3.4'
>>> from pysqlite2 import dbapi2 as sqlite # http://www.initd.org/tracker/pysqlite/wiki/pysqlite
>>> sqlite.sqlite_version
'3.4.0'
>>>

Unabhängig davon, habe ich von sqlalchemy absolut keine Ahnung. Aber da es ein Python-Programm zu sein scheint, glaube ich, dass dort eher die pySQLite Version eine Rolle spielt.

Ich kann aber auch total falsch liegen, da ich mir nicht alles durchgelesen habe.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ElSids
User
Beiträge: 16
Registriert: Montag 25. Juni 2007, 13:15
Wohnort: Corciano/Italien

Vielen Dank für die netten Hilfen

Bzgl Sqlalchemy möchte ich noch Folgendes hinzufügen:

DasProblem ist nicht welche Version von Sqlite installiert ist, sondern wie sqlalchemy darauf zugreift. Dazu benutzt sqlalchemy die Vorgaben von pysqlite.

Beispiel:
>>>import sqlite3
>>>print sqlite3.version
>>>2.3.2
>>>print sqlite3.sqlite_version
3.3.17

Lade ich hingegen:
>>>from pysqlite2 import dbapi2 as dbapi
>>>print dbapi.sqlite_version
3.3.10

sqlalchemy greift eben über die dbapi2 von pysqlite auf sqlite zu anstatt zu überprüfen welche Version nun die aktuellste ist.

Zugriff auf sqlite bei sqlalchemy:

Code: Alles auswählen

        try:
            from pysqlite2 import dbapi2 as sqlite
        except ImportError, e:
            try:
                from sqlite3 import dbapi2 as sqlite #try the 2.5+ stdlib name.
            except ImportError:
                try:
                    sqlite = __import__('sqlite') # skip ourselves
                except ImportError:
                    raise e
Wen es interessiert, kann nachschauen unter:
http://groups.google.de/group/turbogear ... fc10f059b3

Alle dort vorgestellten Lösungen funktionieren bei mir nicht (Windows XP im übrigen).
Per Zufall habe ich festgestellt, dass eine unter sqlobject angelegte Datenbank einwandfrei mit sqlalchemy zu bearbeiten war, ohne dass vorab die bekannte Fehlermeldung erfolgte.

Da ich aber nicht Sherlock Holmes bin und nicht Don Quichot spielen möchte, habe ich sqlalchemy ad acta gelegt.

Edit by Gerold: Code in Code-Tags gesetzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ElSids hat geschrieben:Entwicklung: python (Listen, Dictionaries, pickle), sqlite3, pysqlite, sqlalchemy, sqlobject - aus. ("Große" Datenbanken habe ich von vorneherein ausgeschlossen)
Äpfel mit Bananen mit Zitronen verglichen:
  • Pythons pickle und shelve dienen der direkten Serialisierung von Daten
  • pysqlite ist eine der Anbindungen an SQLite. Es gibt noch zwei, drei weitere, aber die brauchst du eigentlich nicht zu kennen
  • sqlite ist ein RDBMS, also ein Datenbanksystem. Wie MySQL oder PostgreSQL, nur eben kleiner und für den Einsatz in Programmen gedacht, die keinen großen Datenbankserver benötigen.
  • SQLAlchemy und SLQObject sind ORMs, sie dienen dazu Objekte in relationale Datenbanken zu speichern und sie wieder auszulesen. Dies ist nötig, weil man keine Objekte in RDBMS speichern kann. Beide unterstützen neben SQLite auch PostgreSQL und MySQL.
  • Nicht von dir angesprochen: ZODB und Durus, zwei OODBMS, also Objektorientierte Datenbanken, wo du direkt Objekte reinspeichern kannst, ohne ORM. Da spart man sich das ganze SQL.
    ElSids hat geschrieben:(Sagt, gibts eigentlich eine Hilfe, wie ich die Datenein/ausgabe mit einer Gui bewerkstelligen kann, oder verwaltet ihr die Datenbanken tatsächlich über die IDLE ?)
    Ich für meinen Teil benutze meist die Dienstprogramme ``sqlite3`` und ``psql`` was zu PostgreSQL gehört. Langsam habe ich begonnen, sie zu mögen - insbesondere letzteres. Ist jetzt sicher nicht jedermanns Sache, weil man da eben SQL braucht, aber das meiste läuft bei mir sowieso über ein ORM, daher ist das bischen SQL nicht tragisch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten