使用pypyodbc是否可读取MS Access数据库中各数据表间的关联关系
pypyodbc读取MS Access数据表关联关系说明
可以,pypyodbc完全支持读取MS Access数据库中多张表之间的关联(外键约束)关系,有两种常用实现方式:
方法1:使用pypyodbc内置foreignKeys()方法(推荐)
这是最简便的方式,不需要额外查询系统表,调用游标对象的内置方法即可直接返回所有外键关联信息。
示例代码如下:
import pypyodbc # 连接Access数据库,连接字符串根据你的文件路径、版本调整 conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\path\to\your\database.accdb;' conn = pypyodbc.connect(conn_str) cursor = conn.cursor() # 不传参数时返回所有表的外键关联关系 all_relations = cursor.foreignKeys().fetchall() # 也可以指定查询单个表的关联关系,比如查询名为order的表的外键 # order_relations = cursor.foreignKeys(table='order').fetchall() # 关键返回字段说明 for rel in all_relations: print(f"父表(主键所在表):{rel.PKTABLE_NAME}") print(f"父表关联字段:{rel.PKCOLUMN_NAME}") print(f"子表(外键所在表):{rel.FKTABLE_NAME}") print(f"子表关联字段:{rel.FKCOLUMN_NAME}") print(f"外键约束名:{rel.FK_NAME}") print("---") cursor.close() conn.close()
方法2:查询Access系统表MSysRelationships
如果你需要获取关联关系的更多属性(比如级联更新、级联删除规则),可以直接查询Access内置的系统表:
# 连接数据库后执行查询 cursor.execute("SELECT szReferencedObject, szObject, szColumn, szReferencedColumn, grbit FROM MSysRelationships") sys_relations = cursor.fetchall() for rel in sys_relations: print(f"被关联表:{rel[0]}") print(f"关联表:{rel[1]}") print(f"关联字段:{rel[2]}") print(f"被关联字段:{rel[3]}") # grbit字段存储关联规则,比如1代表级联更新,2代表级联删除 print(f"关联规则编码:{rel[4]}")
注意:默认状态下
MSysRelationships表没有读取权限,你需要先打开Access数据库,在选项中开启系统表可见,然后给当前用户授予该表的读取权限,才能正常查询。
注意事项
- 确保你的pypyodbc运行环境(32位/64位)和安装的Access ODBC驱动版本一致,否则会出现连接失败问题
- 如果数据库设置了加密,需要在连接字符串中补充
PWD=你的数据库密码参数,才能正常读取关联信息
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

