2012-06-19 161 views
1

我正在使用pyodbc連接到各種符合odbc的數據庫。如何使用pyodbc從所有符合odbc的數據庫中獲取結果?

假設一個MySql數據庫有名字,年齡,國籍。現在我的要求是,我必須以產生含有在它的記錄,例如一個詞典:

{'Name' : 'a', 'Age' : '20'} 

如果pyodbc對象的execute()方法中指定的查詢。

我做了什麼讓標題即「名」 colums,「年齡」是我創建了一個新表與選擇查詢,然後使用

select column_name from information_schema.columns where table_name=xxx 

得到列標題。我不知道是否查詢'創建表','下拉表'和'選擇列名稱 ....'命令都符合odbc兼容數據庫。我檢查了PostgreSQL和MySQL,做工精細,但如果它們是不同的,然後我需要改變我的實現,將是這樣的:

if mysql: 
    execute(this) 
if posegresql: 
    execute(this) 
if ibmdb2: 
    execute(this) 

如果我上面提到的查詢是相同的所有數據庫,則有沒有問題,但如果它們不同,那麼簡單和有效的解決方案是什麼?

回答

2

在一個問題中存在很多問題。

起初有一些DB-API將一些東西標準化,其中一個是description,你用SELECT得到的列。你不應該使用information_schema這樣的事情。如果您使用其他表中的列,或者只顯示COUNT(*),您會顯示什麼?這是如何使用description獲取列名(與pyodbc和羅斯文MS Access數據庫試過):

rs = c.execute("SELECT * FROM Categories") 
cols = [d[0] for d in rs.description] 
print(cols) 
for rs in c.fetchall(): 
    print(rs) 

對於SQL則沒有,每個數據庫都有自己的方言。其中一些是常見的,但有很多不同之處。例如,日期時間字符串可能非常不同。

當然,您可以通過DAL使用數據庫:https://en.wikipedia.org/wiki/Database_abstraction_layer,但我只使用了web2py的DAL。我認爲如果你想建立更大的,獨立於數據庫的東西,使用這種現有的DAL將是最簡單的想法。 ODBC和JDBC等類似標準只是連接數據庫,執行一些查詢或執行其他語句,檢查元數據(列名等)的方法,但它們不會隱藏SQL方言區別。

+0

感謝。實際上,允許選擇查詢。我將使用列的描述來獲取查詢產生的列。 – ashokadhikari

1

正如@MichałNiklas所述,光標的description變量是檢索列元數據的最佳方法。

要創建的字典將列名和列值的列表一起(假設pyodbc被加載,數據庫建立連接,並且光標c):

rs = c.execute("SELECT * FROM Categories") 
cols = [d[0] for d in rs.description] 
results = [] 
for row in c.fetchall(): 
    results.append(dict(zip(cols,row))) 
+0

感謝您的答案:)。 – ashokadhikari

相關問題