Skip to main content
 首页 » 编程设计

python之我可以在 Python 的 DB API 中使用 .description() 获取表名和列名吗

2025年05月04日14tintown

我将 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 语句:

  1. 今天来自哪个表?

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