我正在尝试使用Pandas.read_sql将数据库中的表名读取到列表中。 我尝试过在线发现的不同SQL查询:
cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ=' + str(self.file_selected)+';Uid=Admin;Pwd=; ')
# sql = "SELECT * FROM SYS.TABLES" # tried this - also an error
sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='database_name.MDB'"
self.TableNames = pd.io.sql.read_sql(sql, cnxn)
cnxn.close()
但是我收到一个错误,它无法找到文件database_name.INFORMATION_SCHEMA.TABLES
我应该为sql查询使用什么?
答案 0 :(得分:1)
在MS Access中,您可以使用其系统表 MSysObjects 检索数据库上的元数据。下面是一个DML调用来检索所有表名:
SELECT MSysObjects.Name
FROM MsysObjects
WHERE ((MSysObjects.Type)=1)
ORDER BY MSysObjects.Name;
但是,默认情况下,这不适用于外部ODBC调用,例如在Python中,因为不允许使用权限。要解决此问题,请考虑两条路线:
授予权限 (适用于管理员用户)
在MSAccess.exe GUI中,打开数据库并运行VBA子例程(在独立模块中),只需运行一次:
Public Sub GrantMSysPermission()
Dim strSQL As String
strSQL = "GRANT SELECT ON MSysObjects TO Admin;"
CurrentProject.Connection.Execute strSQL
End Sub
完成后,在pandas read_sql
调用中运行查询。
保存表
在MS Access.exe GUI程序中,运行下面的生成表查询:
SELECT MSysObjects.Name
INTO DBTables
FROM MsysObjects
WHERE ((MSysObjects.Type)=1)
ORDER BY MSysObjects.Name;
然后在Python pandas中,参考新表:
cnxn = pyodbc.connect('DRIVER={{Microsoft Access Driver (*.mdb)}};DBQ=' + \
'{};Uid=Admin;Pwd=;'.format(str(self.file_selected)))
sql = "SELECT * DBTables"
self.TableNames = pd.io.sql.read_sql(sql, cnxn)
cnxn.close()