2017-03-06 105 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()