使用 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 选择表中的列名的主要内容,如果未能解决你的问题,请参考以下文章