使用 PyODBC 选择表中的列名

Posted

技术标签:

【中文标题】使用 PyODBC 选择表中的列名【英文标题】:Select column names in a table using PyODBC 【发布时间】:2010-11-19 17:44:20 【问题描述】:

我正在编写一个 Python 程序,它使用 PyODBC 从 Microsoft Access mdb 文件中选择一些数据。

我需要发现几个不同表的列名。在 SQL Server 中,这可以通过使用类似的查询来完成

SELECT c.name FROM sys.columns c, sys.tables t
WHERE c.object_id = t.object_id
AND t.name = tableName

但该查询在 Access 中不起作用。与

SELECT MSysObjects.Name FROM MSysObjects
WHERE (((MSysObjects.Flags)=0) AND ((MSysObjects.Type)=1))
ORDER BY MSysObjects.Name

我可以获得非链接表名列表,但 MSysObject 似乎不包含列名列表。

有没有办法使用 SQL 来获取 Access 数据库中表的列名?

【问题讨论】:

如果有连接,可以使用 ADO Schema:Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "tablenamehere")) 吗?另见msdn.microsoft.com/en-us/library/kcax58fh(VS.80).aspx 我不能。但是当我查找时,我发现 PyODBC 有一个使用 SQLColumns 的辅助方法。 【参考方案1】:

我无法找到一个 SQL 查询来完成此操作。但是,我确实发现 PyODB 有一个可以返回列列表的游标方法

# columns in table x
for row in cursor.columns(table='x'):
    print row.column_name

【讨论】:

我在旧的 .mdb 文件中发现它是第四个元素,即 row[3] 是列的实际名称。 我有一个旧的 mdb(1995),我无法获取列名。即使使用 row[3] 也不行。【参考方案2】:

Python 3

通过列名访问

table_row = conn.execute(query)
for row in table_rows:
     print (row.nameColumn)

通过列索引访问

table_row = conn.execute(query)
for row in table_rows:
     print (row[0])

【讨论】:

【参考方案3】:

我不确定查询那个版本的 MS-Access 的限制,但我在其他类似情况下看到的一个解决方案是 SELECT * FROM table LIMIT = 0(或 1 取决于)。然后,您可以从结果中收集返回的列名。

【讨论】:

访问不支持LIMIT;它似乎也不喜欢“SELECT TOP 0 * FROM table”msdn.microsoft.com/en-us/library/bb208930%28office.12%29.aspx "WHERE 1=2" 将返回零行。 选择零行给我“无”。 在什么情况下给你“无”?零行的记录集仍然具有完整的字段集合,因此您的问题可能与您执行 SELECT 的方式有关。 cursor.execute("SELECT * FROM table WHERE 1=2"); print cursor.fetchone() #返回“无”。无论如何,cursor.columns 函数看起来是解决这个问题的首选方法。

以上是关于使用 PyODBC 选择表中的列名的主要内容,如果未能解决你的问题,请参考以下文章

如何从laravel中的表中选择所有列名?

使用 pyodbc 从 SQL 中检索数据

从动态表中选择时更改列名

SQL - 如何从多个可能的列名中进行选择?

如何使用列名在 Excel 过滤表中选择多个不相邻的列

如何使用 pyodbc 获取 Access 数据库特定字段的数据类型?