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

1 投票
3 回答
12322 浏览
提问于 2025-04-16 09:05

我正在使用pyodbc来从一个大的.mbd(Access)文件中提取数据。

我想创建一个新表,从几个现有表中提取相关信息(然后把这些信息输入到一个工具中)。

我觉得我知道如何转移数据,也知道如何根据列名和数据类型来创建表,但我在获取现有表中各列的数据类型(比如INTEGER、VARCHAR等)时遇到了困难。我需要这些类型来兼容地创建新列。

我在网上找到的一些资料(比如这个这个)让我遇到了无效命令的问题,所以我觉得这可能是特定平台的问题。而且,我对数据库的了解还很浅。

有没有人知道如何获取这些字段的数据类型?

3 个回答

0

你可以从这个输出中获取一些信息:

import pandas as pd
dbq='D:\....\xyz.accdb'
conn=pyodbc.connect(r"Driver={Microsoft Access Driver (*.mdb, *.accdb)}; Dbq=%s;" %(dbq))
    
query = 'select * from tablename'
    
dataf = pd.read_sql(query, conn)
print(list(dataf.dtypes))
2

我对pyodbc不太熟悉,不过我以前在VBA里做过类似的事情。

你提到的那两个链接是针对SQL Server的,不是Access的。如果想知道Access表中每个字段的数据类型,可以使用DAO或ADOX。

这里有一个我在Excel 2010中用VBA做的例子,我连接到Access数据库(2000 mdb格式),并列出了表、字段及其数据类型(比如用枚举表示,'4'代表dbLong)。你可以在输出中看到系统表,底部是用户创建的表。

在网上你可以很容易找到关于如何用ADOX做类似事情的例子。希望这对你有帮助。

Private Sub TableDefDao()
    Dim db As DAO.Database
    Set db = DAO.OpenDatabase("C:\Database.mdb")

    Dim t As DAO.TableDef
    Dim f As DAO.Field
    For Each t In db.TableDefs
        Debug.Print t.Name
        For Each f In t.Fields
            Debug.Print vbTab & f.Name & vbTab & f.Type
        Next
    Next
End Sub
8

那些文章对你没有帮助的原因是,它们是针对SQL Server的。SQL Server有系统表,你可以查询这些表来获取列的数据,而MS Access没有这样的功能。MS Access只能让你查询对象的名称。

不过,ODBC确实支持通过它的连接获取架构信息,这可以通过ODBC.SQLColumns函数来实现。

根据这个回答,PyODBC通过一个游标方法提供了这个功能。

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

正如Mark在评论中提到的,你可能还想要row.data_type。 他提供的链接包含了它提供的所有列信息。

  1. table_cat
  2. table_schem
  3. table_name
  4. column_name
  5. data_type
  6. type_name
  7. column_size
  8. buffer_length
  9. decimal_digits
  10. num_prec_radix
  11. nullable
  12. remarks
  13. column_def
  14. sql_data_type
  15. sql_datetime_sub
  16. char_octet_length
  17. ordinal_position
  18. is_nullable: 可能的值有SQL_NULLABLE, SQL_NO_NULLS, SQL_NULLS_UNKNOWN。

撰写回答