Sind Datenbanken gleich ansprechbar?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Montag 7. Mai 2007, 12:41

Hallo. Ich möchte ein etwas größeres Programm machen, in dem unter Umständen auch mehrere Benutzer gleichzeitig auf die Datenbank zugreifen.
Meine erste Frage:
Welche Datenbanken empfehlen sich da?

die zweite Frage:
Ich fände es gut, wenn ich, egal welche Datenbank ich im Endeffekt nun nutze, jede Datenbanke mit dem gleichen Object ansprechen könnte. Beispiel:

Code: Alles auswählen

if(DB == "sqlite"):
DBOBJECT = sqlite3.connect(.....)
elif(DB == "postgre"):
DBOBJECT = postgresql.connect(......)
Zumindest hatte ich mir das so in der Art vorgestellt. Ist das möglich?

Gruß sprudel
Benutzeravatar
Whitie
User
Beiträge: 111
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Montag 7. Mai 2007, 12:46

Hallo sprudel,
guck mal unter http://www.sqlalchemy.org, ob das was für Dich ist.
Ich kann es nur empfehlen.

Gruß, Whitie
BlackJack

Montag 7. Mai 2007, 12:55

@sprudel: Das ist grundsätzlich so möglich, Du müsstest allerdings korrekt einrücken und die Klammern bei den Bedingungen sind überflüssig.

Ausserdem gilt die Namenskonvention "GROSSE_BUCHSTABEN" sind Konstanten. Das trifft wohl auf beide Namen nicht zu.
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Montag 7. Mai 2007, 13:12

BlackJack hat geschrieben:@sprudel: Das ist grundsätzlich so möglich, Du müsstest allerdings korrekt einrücken und die Klammern bei den Bedingungen sind überflüssig.

Ausserdem gilt die Namenskonvention "GROSSE_BUCHSTABEN" sind Konstanten. Das trifft wohl auf beide Namen nicht zu.
Das mit den Buchstaben merk ich mir ;-) Programmier noch nicht allzu lang Python. Jetzt die Frage:

mache ich dann weiterhin folgendes?:

Code: Alles auswählen

c= dbobject.cursor()
c.commit("Select xyz FROM `tabelle` WHERE ?",(parameter1) )
Oder unterscheiden sich die Datenbankobjekte da irgendwie?
BlackJack

Montag 7. Mai 2007, 13:24

Leider ja, es gibt verschiedene Möglichkeiten für den Platzhalter. Im PEP zur DB API 2.0 steht mehr dazu.

Code: Alles auswählen

In [29]: import pysqlite2.dbapi2 as sqlite

In [30]: sqlite.paramstyle
Out[30]: 'qmark'
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Montag 7. Mai 2007, 14:08

Unterscheiden sie sich sonst noch irgendwie? Weil so wäre es ja im Prinzip kein allzu großes Problem.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 7. Mai 2007, 14:22

sprudel hat geschrieben:Unterscheiden sie sich sonst noch irgendwie?
Nuja, im SQL das sie unterstützen unterscheiden sie sich.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Montag 7. Mai 2007, 14:42

SQLite hat Probleme mit konkurrierenden Zugriffen, das empfiehlt sich dann wohl weniger.

Wenn du DBMS-unabhängig sein oder keine speziellen Eigenheiten eines DBMS nutzen möchtest, bist du möglicherweise mit Elixir besser beraten, einem objektrelationalen Mapper, der seinerseits auf SQLAlchemy aufsetzt. Damit lässt sich sehr schön und schnell arbeiten.
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Montag 7. Mai 2007, 16:07

Im Prinzip will ich nur einzelne Querys machen, sonst nichts.

Das einzige was ich bisher gebraucht habe, ist .execute() .commit() und dann eben den Cursor zum Durchlaufen mit for.

Gibts da nix einfacheres?

Im Prinzip würden mir auch schon 2 Datenbanken reichen: PostgreSQL und Sqlite. Das erste für mehrere gleichzeitige Zugriffe, das 2. für einzige.

Könnte man da nicht im Prinzip eine neue Klasse erschaffen?
Was ist denn der Platzhalter bei Postgre?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Montag 7. Mai 2007, 23:46

Elixir ist einfacher. Schau dir mal die Beispiele auf der Site an, die bringen dir hoffentlich einen Einblick.

Bsp.:

Code: Alles auswählen

from elixir import *  # böse!

class Book(Entity):
    has_field('author_name', Unicode(200))
    has_field('title', Unicode(200))
    has_field('year', Integer)

# Anwendung
books = Book.select()
for book in books:
    print '"%s" von %s, erschienen %d' % (
        book.title, book.author_name, book.year)
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 8. Mai 2007, 07:47

Ich glaube hier wird ein wenig aneinander vorbei gesprochen, von wegen DB-API <-> ORM ;)

Deswegen hab ich mal einen neuen Wiki Artikel geschrieben: [wiki]DB-API[/wiki]
Wie immer: Bitte erweitern/verbessern...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 8. Mai 2007, 10:19

Das sehe ich anders. Er will unabhängig vom letztlich verwendeten DBMS eine Datenbank-gestützte Funktionalität implementieren, und zwar gerne einfach. Daher auch meine Frage nach speziellen Anforderungen, die mehr als 08/15-SQL erfordern. Für ein bisschen CRUD ist ein deklarativer Mapper wie eben Elixir nämlich eine sehr feine Sache. Und selbst bei dessen Benutzung kann man zwischendurch immer noch SA direkt nutzen.
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Dienstag 8. Mai 2007, 15:03

sprudel hat geschrieben:
BlackJack hat geschrieben:@sprudel: Das ist grundsätzlich so möglich, Du müsstest allerdings korrekt einrücken und die Klammern bei den Bedingungen sind überflüssig.

Ausserdem gilt die Namenskonvention "GROSSE_BUCHSTABEN" sind Konstanten. Das trifft wohl auf beide Namen nicht zu.
Das mit den Buchstaben merk ich mir ;-) Programmier noch nicht allzu lang Python.
Dass Konstanten groß geschrieben werden hat nix mit Python zu tun.
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Dienstag 8. Mai 2007, 16:58

Mal' am Rande: Müssen all diese User wirklich Schreibzugriffe machen ? Sonst ist sqlite allein evt. ausreichend.
[color=green][size=75]Never use idle.pyw, if you need sys.stdin[/size][/color]
Antworten