【问题标题】:Select column names in a table using PyODBC使用 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 的辅助方法。

标签: python ms-access ms-access-2007 pyodbc


【解决方案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 函数看起来是解决这个问题的首选方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2017-10-09
    相关资源
    最近更新 更多