2

我在 SQLite 3 中使用 Python。我有用户输入 SQL 查询,需要为模板语言格式化这些查询的结果。

因此,基本上,我需要使用 DB API 游标(PEP 249)的 .description,但我需要同时获取列名表名,因为用户经常进行联接。

显而易见的答案,即读取表定义是不可能的——许多表具有相同的列名。

对于 avg(field) 等聚合函数,我还需要对列/表名称进行一些智能行为...

我能想出的唯一解决方案是使用 SQL 解析器并分析 SELECT 语句(叹气),但我还没有找到任何看起来非常好的 Python 的 SQL 解析器?

我没有在文档中找到任何东西,也没有发现任何其他有同样问题的人,所以我可能错过了一些明显的东西?

编辑:要清楚 - 问题是找到 SQL 选择的结果,其中选择语句由用户在用户界面中提供。我无法控制它。正如我上面提到的,阅读表定义没有帮助。

4

1 回答 1

1

Python 的DB API只为 cursor.description 指定列名(并且此 API 的任何 RDBMS 实现都不会返回查询的表名......我会告诉你为什么)。

您所要求的非常困难,甚至只能通过 SQL 解析器来实现……即使如此,在许多情况下,即使是列来自哪个“表”的概念也可能没有多大意义。

考虑以下 SQL 语句:

  1. 来自哪张表today

    SELECT DATE('now') AS today FROM TableA FULL JOIN TableB 
    ON TableA.col1 = TableB.col1;
    
  2. 来自哪张表myConst

    SELECT 1 AS myConst;
    
  3. 来自哪张表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);
    
  4. 来自哪张表myCol

    SELECT SUM(a) as myCol FROM (SELECT a FROM table1 UNION SELECT b FROM table2);
    

以上是非常简单的 SQL 语句,您要么必须为它们组成一个“表”,要么任意选择一个......即使你有一个 SQL 解析器!

SQL 为您提供的是一作为结果返回的数据。该集合中的元素不一定归属于特定的数据库表。您可能需要重新考虑解决此问题的方法。

于 2012-06-02T03:11:18.033 回答