我将 Python 与 SQLite 3 结合使用。我有用户输入的 SQL 查询,需要为模板语言格式化这些查询的结果。
所以,基本上,我需要使用 DB API 游标(PEP 249)的 .description,但我需要同时获取列名 和 表名,因为用户经常进行连接.
显而易见的答案,即读取表定义,是不可能的——许多表具有相同的列名。
我还需要一些关于列/表名称的智能行为,以用于聚合函数,如 avg(field)...
我能想到的唯一解决方案是使用 SQL 解析器并分析 SELECT 语句(叹息),但我还没有找到任何看起来非常好的 Python SQL 解析器?
我没有在文档中找到任何内容,也没有找到任何其他有相同问题的人,所以我可能错过了一些明显的东西?
编辑:要清楚——问题是找到 SQL 选择的结果,其中选择语句由用户在用户界面中提供。我无法控制它。如上所述,阅读表定义无济于事。
请您参考如下方法:
Python 的 DB API仅指定 cursor.description 的列名(并且此 API 的 RDBMS 实现都不会返回查询的表名......我会告诉你原因)。
你要求的是非常困难的,甚至只有使用 SQL 解析器才能实现......即使这样,在很多情况下,甚至连 “表” 列的概念都是from 可能没有多大意义。
考虑这些 SQL 语句:
今天来自哪个表?SELECT DATE('now') AS today FROM TableA FULL JOIN TableB ON TableA.col1 = TableB.col1;myConst来自哪个表?SELECT 1 AS myConst;myCalc来自哪个表?SELECT a+b AS myCalc FROM (select t1.col1 AS a, t2.col2 AS b FROM table1 AS t1 LEFT OUTER JOIN table2 AS t2 on t1.col2 = t2.col2);myCol来自哪个表?SELECT SUM(a) as myCol FROM (SELECT a FROM table1 UNION SELECT b FROM table2);
以上是非常简单的 SQL 语句,您要么必须为其创建一个“表”,要么任意选择一个...即使您有 SQL 解析器!
SQL 为您提供的是作为结果返回的数据集。该集合中的元素不一定属于特定的数据库表。您可能需要重新考虑解决此问题的方法。
