【问题标题】:Can I get table names along with column names using .description() in Python's DB API?我可以在 Python 的 DB API 中使用 .description() 获取表名和列名吗?
【发布时间】:2012-03-27 14:39:47
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: python python-db-api


    【解决方案1】:

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

    您所要求的内容非常困难,甚至只能通过 SQL 解析器来实现......即使如此,在很多情况下,即使是列的概念也是 "Table" from 可能没有多大意义。

    考虑这些 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 为您提供的是作为结果返回的一组数据。该集合中的元素不一定归属于特定的数据库表。您可能需要重新考虑解决此问题的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      相关资源
      最近更新 更多