在接触了众多数据库抽象层之后,我开始怀疑每个库发明自己的不同范例来访问数据的意义何在。选择一种新的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。重命名的关键字和语法技巧很可爱,但是IMO刚出现时,对于编码人员而言,它们并没有使检索行变得更加容易。
这似乎有些漫长,但是这里确实有一个问题。由于每个DAL似乎都发明了一种用于查询的新DSL,而不仅仅是解析经过验证的SQL,因此使用不同的语法必须有好处,或者我没有意识到标准SQL语法的不足。有人可以指出我在这里俯瞰的景色吗?