Nachdem ich zahlreichen Datenbankabstraktionsebenen ausgesetzt war, frage ich mich, worauf es bei jeder Bibliothek ankommt, die ihr eigenes Paradigma für den Datenzugriff entwickelt. Das Aufnehmen einer neuen DAL fühlt sich an, als würde ich eine neue Sprache noch einmal lernen, wenn ich normalerweise nur die Ebene davon überzeugen möchte, eine SQL-Abfrage auszugeben, die ich bereits in meinem Kopf geschrieben habe.
Und das, ohne die Lesbarkeit im Nachhinein anzugreifen:
# Exhibit A: A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
.inner_join(db.ips_x_users.user_id == db.users.id)
.select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)
# Exhibit B: Another typical DAL
rows = db.ips_x_users
.join(db.users, on=db.ips_x_users.user_id == db.users.id)
.filter(db.ips_x_users.ip_addr == '127.0.0.1')
.select(sort=~db.ips_x_users, limit=10)
# Exhibit C: A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
INNER JOIN users ON
(ips_x_users.user_id = users.id)
WHERE ips_x_users.ip_addr = ip
ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')
Was stimmt nicht mit der Standard-SQL-Syntax? Es wurde für einen bestimmten Zweck erstellt und passt wunderbar zu diesem Zweck. Vielleicht bin es nur ich, aber ich verstehe Snippet C viel leichter als die ersten beiden. Die umbenannten Schlüsselwörter und Syntaxtricks sind niedlich, aber IMO, wenn es darum geht, machen sie das Abrufen von Zeilen für den Codierer nicht einfacher.
Dies schien wahrscheinlich eine lange Angelegenheit zu sein, aber hier gibt es eine echte Frage. Da jede DAL eine neue DSL für Abfragen zu erfinden scheint, anstatt nur bewährtes SQL zu analysieren, muss es entweder Vorteile bei der Verwendung einer anderen Syntax geben oder Mängel in der Standard-SQL-Syntax, von denen ich nicht weiß, dass sie vorhanden sind. Kann jemand bitte darauf hinweisen, was ich hier übersehen habe?