SQLITE und MYSQL gleich ansprechen

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

Dienstag 8. April 2008, 15:58

Hallo,

Gibt es die Möglichkeit (außer SQLALCHEMY) die Datenbanktypen SQLITE und MYSQL gleich anzusprechen?
Das heißt beim execute z.B. der gleiche Platzhalter).

Ich dachte bisher ich könnte sqlite und mysql genau gleich ansprechen, wenn ich doch nur den Cursor auf eine Variable wie z.B. DB setze.

Doch das scheint nicht so zu funktionieren.
Python meldet
"Not all arguments converted during string formatting"
Scheint also was mit dem Platzhalter oder so nicht zu stimmen.

Hoffe ihr wisst Bescheid.

Gruß Chris
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Dienstag 8. April 2008, 16:13

Hallo auch,

Schreib dir doch selber eine Interface-Mittelschicht und Wrapper für beide DatenbankManagementSysteme.

Wenn du plietsch bist, schreibst du dir PythonCode- oder JustInTime-Generatoren, um nicht sämtliche SQL-Statements doppelt, dreifach, ... oder wieviele DBMS du noch supporten möchtest, schreiben zu müssen.

>>Masaru<<
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Dienstag 8. April 2008, 16:41

Hallo.

Das hab ich mir auch schon als - zugegeben eher unliebsame - Lösung überlegt. Eventuell auch eine Klasse die beides vereint.
Gibt es denn nicht noch andere Lösung?
Quasi eine Art "dbunited" Modul ;-)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 8. April 2008, 16:46

sprudel hat geschrieben:Gibt es die Möglichkeit (außer SQLALCHEMY) die Datenbanktypen SQLITE und MYSQL gleich anzusprechen?
Gibt es einen speziellen Grund, warum du SQLAlchemy nicht magst?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 8. April 2008, 16:48

Dazu gibt es etwas im Python-Cookbook:

"Using a Single Parameter-Passing Style Across Various DB API Modules", S. 323

Und daher sicherlich auch irgendwo in der Onlineausgabe.
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Dienstag 8. April 2008, 16:48

Leonidas hat geschrieben:
sprudel hat geschrieben:Gibt es die Möglichkeit (außer SQLALCHEMY) die Datenbanktypen SQLITE und MYSQL gleich anzusprechen?
Gibt es einen speziellen Grund, warum du SQLAlchemy nicht magst?
Ich habe mir das mal ein bisschen angeguckt, und es wirkt alles so überladen. Oder ist es da auch einfach möglich ein Query auszuführen und dann die Werte ganz normal in einer While schleife zu iterieren?
Habe das überall im Internet nämlich ganz anders gesehen
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 8. April 2008, 16:55

sprudel hat geschrieben:Oder ist es da auch einfach möglich ein Query auszuführen und dann die Werte ganz normal in einer While schleife zu iterieren?
Habe das überall im Internet nämlich ganz anders gesehen
Aus dem Tutorial:

Code: Alles auswählen

>>> for user in session.query(User):
...     print user.name
ed
wendy
mary
fred
Außerdem ist SQLAlchemy nicht das einzige ORM, es gibt durchaus noch weitere, die man sich ansehen könnte, wenn man damit wirklich nicht zurechtkommt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Dienstag 8. April 2008, 17:01

Und wie mache ich überhaupt erst die Querys?
Ich werde mir das auf jeden Fall gleich mal angucken.
Danke - ihr habt mich hoffentlich von einer Eigenentwicklung bewahrt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 8. April 2008, 17:12

sprudel hat geschrieben:Und wie mache ich überhaupt erst die Querys?
Ehm, du hast doch da ein Query welches alle User-Objekte aus der Datenbank holt?! Sieh dir doch mal das Tutorial an.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Dienstag 8. April 2008, 17:54

Leonidas hat geschrieben:
sprudel hat geschrieben:Und wie mache ich überhaupt erst die Querys?
Ehm, du hast doch da ein Query welches alle User-Objekte aus der Datenbank holt?! Sieh dir doch mal das Tutorial an.
Hallo
nehmen wir jetzt einmal als Beispiel "Select id,fname,lname from users order by regdate desc limit 5"
ich möchte das jetzt in einer Schleife alles durchlaufen.
Geht das?
Bzw. wo finde ich überhaupt das Tutorial? In Google habe ich nur ein Englisches gefunden, stehe aber vermutlich dabei wieder ziemlich auf dem Schlauch.

Chris
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Dienstag 8. April 2008, 19:17

Es gibt nicht alles auf deutsch ;-)

SQLalchemy.org da gibt es das offizielle Tutorial.

aber das hier http://entwickler.de/zonen/portale/psec ... ,1033.html ist auf deutsch und ähnlich aufgebaut.
sprudel
User
Beiträge: 245
Registriert: Donnerstag 8. März 2007, 17:12

Dienstag 8. April 2008, 19:20

Sr4l hat geschrieben:Es gibt nicht alles auf deutsch ;-)
Verlang ich doch auch nicht ;-)
Aber versteh doch - ich bin 16 Jahre alt. Da ist ein Fachenglisch gelegentlich schon zu viel verlangt, auch wenn ich mein Englisch in diesem Bereich als überdurchschnittlich einschätzt. Aber es macht das ganze leider ungemein schwerer.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 8. April 2008, 23:05

sprudel hat geschrieben:Aber versteh doch - ich bin 16 Jahre alt. Da ist ein Fachenglisch gelegentlich schon zu viel verlangt, auch wenn ich mein Englisch in diesem Bereich als überdurchschnittlich einschätzt. Aber es macht das ganze leider ungemein schwerer.
Uhh? Also mit 16 war das überhaupt kein Problem für mich. Außerdem ist IT-Englisch noch mal eine runde einfacher als normales, umgangssprachliches Englisch.

Wenn du dir das Tutorial angesehen hättest, könntest du durchaus drauf gekommen sein:

Code: Alles auswählen

import datetime
from sqlalchemy import desc, MetaData, Column, Unicode, DateTime, create_engine
from sqlalchemy.orm import sessionmaker, mapper

engine = create_engine('sqlite:///:memory:', echo=True)

metadata = MetaData()
users_table = Table('users', metadata,
        Column('id', Integer, primary_key=True),
        Column('fname', Unicode(40)),
        Column('lname', Unicode(40)),
        Column('regdate', DateTime)
)

metadata.create_all(engine)

class User(object): pass

mapper(User, users_table)

first_user = User()
first_user.fname = 'First'
first_user.lname = 'Last'
first_user.regdate = datetime.datetime.now()

Session = sessionmaker(bind=engine, autoflush=True, transactional=True)
session = Session()
session.save(first_user)

for user in session.query(User).order_by(desc(users_table.c.regdate)).all():
    print user.fname, user.lname
Also eigentlich ist nur die vorletzte Zeile das Query, der Rest ist nur fürs Setup.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Mittwoch 9. April 2008, 08:46

Leonidas hat geschrieben:... Uhh? Also mit 16 war das überhaupt kein Problem für mich. Außerdem ist IT-Englisch noch mal eine runde einfacher als normales, umgangssprachliches Englisch. ...
Poser Bild
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 9. April 2008, 09:00

Kann sich ja jeder ein Bild von machen: ORM tutorial - sehr zu empfehlen (da ist auch beschrieben, dass man LIMIT mittels Slicing hinbekommt, was ich in meinem Beispiel nicht gezeigt habe). Ordering ist hier dokumentiert und desc() hat auch seine Dokumentation.

Es mag für den Anfang etwas komplex erscheinen, aber wenn man unbedingt will kann man mittels ``declarative`` sich das leben etwas vereinfachen oder mittels Elixir das Verhalten etwas an das von anderen ORMs anpassen, welche nach dem ActiveRecord-Pattern arbeiten, was für den Anfang oft simpler zu verstehen ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten