Unter Common Lisp benutze ich für Datenbankzugriffe gern datafly, damit ich statt elend langer (und potenziell fehleranfälliger) query strings halbwegs nativ auf der Datenbank arbeiten kann; also statt "SELECT col FROM table WHERE id=123":
[codebox=lisp file=Auszug.lisp](select :col
(from :table)
(where
(:= :id 123)))[/code]
Gibt es etwas Vergleichbares auch für Pythons sqlite3-Modul oder bleibt mir da nur die etwas unpraktische Methode mit "c.execute(elend langer String)"?
Wie SQLite3 in native Pythonfunktionen "wrappen"?
SQLAlchemy als ORM kann sowas in der Art:
Das ist wahrscheinlich nicht 1:1 was du suchst, aber ein Blick in SQLAlchemy ist nie verkehrt.
Code: Alles auswählen
session.query(Table.col).filter(Table.id == 123).one()
session.query(Table).filter(Table.id == 123).one().col
# Falls id der Primary Key ist
session.query(Table.col).get(123)
session.query(Table).get(123).col
the more they change the more they stay the same
Das kommt dem, was ich suche, zumindest schon ein bisschen nahe. Danke, ich guck's mir mal an.
Das ORM ist sozusagen erst die zweite Stufe. Eine Ebene tiefer SQLAlchemy kann auch einfach nur als Ersatz für SQL als Zeichenketten verwendet werden:
Und wenn man vorher eine Datenbankengine an die Metadaten vom `table`-Exemplar gebunden hat, kann man einfach ein ``.execute()`` hinten dran hängen um das dann auch auszuführen.
Code: Alles auswählen
In [20]: print sa.select([table.c.col]).where(table.c.id == 123)
SELECT "table".col
FROM "table"
WHERE "table".id = :id_1