带有pandas

时间:2017-03-06 23:37:29

标签: python sql pandas io

我正在尝试使用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查询使用什么?

1 个答案:

答案 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()