在这个系列中,我们将看看我为我的feedreader库写的一个SQL查询生成器。
- 为什么我首先需要一个查询生成器?
- 为什么我决定写我自己的
- 我考虑了哪些替代方案,以及为什么我没有使用现有的库
- 我怎么知道它不会变得太大,也不会成为维护的负担
- 我是如何对这个问题进行建模的,以及我是如何得到这个想法的。
之后,我们将从头开始迭代重写,并谈论。
- API设计
- 元编程
- 更糟糕的做事方式
- 为什么我删除了一些功能
- 权衡利弊,以及知道什么时候该偷懒
那么,它是什么样子的呢?
你在一个Query 对象上调用KEYWORD 方法来追加文本。
>>> query = Query()
>>> query.SELECT('url')
<builder.Query object at 0x7fc953e60640>
>>> print(query)
SELECT
url
为了方便起见,你可以连锁调用(顺序并不重要)。
>>> query.FROM('feeds').SELECT('title', 'updated')
<builder.Query object at 0x7fc953e60640>
>>> print(query)
SELECT
url,
title,
updated
FROM
feeds
为了获得SQL,你将查询转换为字符串。
>>> str(query)
'SELECT\n url,\n title,\n updated\nFROM\n feeds\n'
其他常见的东西也可以。
>>> print(Query().SELECT(('alias', 'long(expression)')))
SELECT
long(expression) AS alias
>>> print(Query().WHERE('condition', 'another condition'))
WHERE
condition AND
another condition
>>> print(Query().FROM('first').LEFT_JOIN('second USING (column)'))
FROM
first
LEFT JOIN
second USING (column)
如果你现在想看一下代码,你可以在这里找到最终版本,在这里找到测试。读者使用的版本在这里(有类型注释,并且有额外的功能)。