在Python中构建SQL查询生成器的方法

344 阅读1分钟

在这个系列中,我们将看看我为我的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)

如果你现在想看一下代码,你可以在这里找到最终版本,在这里找到测试。读者使用的版本在这里(有类型注释,并且有额外的功能)。