pyodbc - 从 MS Access (MDB) 数据库读取主键

den*_*ufa 2 python sql database ms-access pyodbc

当我尝试使用cursor.primaryKeys("tablename")then 时发生异常:

Error: ('IM001', '[IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0) (SQLPrimaryKeys)')

list(cursor.columns(table='tablename')) 也不显示主键。

Gor*_*son 5

对于 Access ODBC,我们通常可以*通过pyodbc对象的.statistics()方法获取主键列cursor

crsr = conn.cursor()
table_name = 'MyTable'
# dict comprehension: {ordinal_position: col_name}
pk_cols = {row[7]: row[8] for row in crsr.statistics(table_name) if row[5]=='PrimaryKey'}
print(pk_cols)  # e.g., {1: 'InvID', 2: 'LineItem'}
Run Code Online (Sandbox Code Playgroud)

*编辑:此方法假定表的主键索引名为PrimaryKey。如果该表是使用 MS Access 表生成器 (GUI)创建的,则是这样,但如果该表是使用 DDL(即,)创建的,则情况并非如此CREATE TABLE …。在这些情况下,主键索引的名称类似于Index_EA5344E1_0942_445C上述方法将不起作用,但我们可以改用 ACE DAO:

import win32com.client  # needs `pip install pywin32`


def get_access_primary_key_columns(db_path, table_name):
    db_engine = win32com.client.Dispatch("DAO.DBEngine.120")
    db = db_engine.OpenDatabase(db_path)
    tbd = db.TableDefs(table_name)
    for idx in tbd.Indexes:
        if idx.Primary:
            return [fld.Name for fld in idx.Fields]


if __name__ == "__main__":
    print(
        get_access_primary_key_columns(
            r"C:\Users\Public\Database1.accdb", "team"
        )
    )
    # ['city', 'prov']
Run Code Online (Sandbox Code Playgroud)

  • @denfromufa - 这些是 [cursor 对象](https://github.com/mkleehammer/pyodbc/wiki/Cursor) 的 `.statistics` 方法文档中定义的列索引。您可以创建自己的变量,例如,`ordinal_position_col = 7`,但除了使代码更具自文档性之外,它也将等同于相同的事情。 (2认同)
  • 实际上它是由 Microsoft 的 ODBC 驱动程序定义的:https://msdn.microsoft.com/en-us/library/ms711022(VS.85).aspx (2认同)