多数のデータベース抽象化レイヤーにさらされた後、私は、データにアクセスするための独自の異なるパラダイムを発明するすべてのライブラリーのポイントが何であるか疑問に思い始めています。新しいDALを取得することは、新しい言語をもう一度学習するように感じます。通常、やりたいことは、既に自分の頭に書いたSQLクエリを出力するようにレイヤーを説得することだけです。
そして、それは事後の読みやすさにさえ触れていない:
# 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')
標準のSQL構文の何が問題になっていますか?特定の目的のために作成され、その目的に美しく適合します。たぶんそれは私だけかもしれませんが、スニペットCは最初の2つよりはるかに簡単に理解できます。名前が変更されたキーワードと構文のトリックはかわいいですが、IMOは、すぐに言えば、コーダーが行を簡単に取得できないようにします。
これはおそらく長い暴言のように思えましたが、ここには本当の疑問があります。すべてのDALは、実証済みのSQLを単に解析するのではなく、クエリ用の新しいDSLを発明しているように見えるため、異なる構文を使用する利点があるか、標準のSQL構文に欠陥があることを認識している必要があります。誰かが私がここで見落としているものを指摘してもらえますか?