2017-03-06 84 views
0

我想从一个数据库中读取表名使用Pandas.read_sql的列表。在网上找到 我已经尝试了不同的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

AFAIK在'MS Access'中没有'INFORMATION_SCHEMA'这样的东西... – MaxU

回答

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 

一旦完成运行上面的查询在熊猫read_sql调用。

保存表

内部MS Access.exe GUI程序,如下表查询运行:

SELECT MSysObjects.Name 
INTO DBTables 
FROM MsysObjects 
WHERE ((MSysObjects.Type)=1) 
ORDER BY MSysObjects.Name; 

然后在Python大熊猫,是指新表:

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