2009-02-23 48 views
11

我有一些代碼,我一直在使用查詢MySQL,我希望可以用它與SQLite。我真正的希望是,這不會對代碼做太多改動。不幸的是,下面的代碼不使用SQLite工作:如何在Python中調用SQLite時通過名稱引用列?

cursor.execute(query) 

rows = cursor.fetchall() 

data = [] 
for row in rows 
    data.append(row["column_name"]) 

這提供了以下錯誤:

TypeError: tuple indices must be integers 

而如果我改變參考使用列號,它工作正常:

data.append(row[1]) 

我可以執行查詢嗎?我可以通過他們的名字引用列嗎?

回答

11

我不知道這是否是最好的方法,但在這裏就是我通常做檢索記錄使用DB-API 2兼容的模塊設置:

cursor.execute("""SELECT foo, bar, baz, quux FROM table WHERE id = %s;""", 
        (interesting_record_id,)) 

for foo, bar, baz, quux in cursor.fetchall(): 
    frobnicate(foo + bar, baz * quux) 

查詢格式化方法之一DB-API標準,但恰巧是Psycopg2的首選方法;其他DB-API適配器可能會提出一個不同的約定,這將是很好的。

寫這樣的查詢,其中隱式元組解包用於處理結果集,對於我來說通常比​​試圖擔心將Python變量名匹配到SQL列名稱更爲有效(我通常只使用它來放置前綴,然後只有當我使用列名稱的子集,以使前綴無助於澄清事情時),並且很多比記住數字列ID更好。

此樣式還可以幫助您避免SELECT * FROM table...,這只是最簡單的表和查詢之外的任何維護災難。

所以,不完全是你要求的答案,但可能有啓發性。

+0

其實,這是完美的!謝謝。 – Ben 2009-02-23 09:13:06

+0

對不起:應該仔細檢查一下。它不太有效。使用SQLite,foo最終變成類似(123)的形式,而使用MySQL時變成('foo':123) – Ben 2009-02-23 09:27:15

+0

像這樣得到的結果讓我懷疑你的MySQL模塊是否符合DB-API 2.0 ......如果它是不是,試圖替換不同的數據庫模塊會變得很難看。你使用哪個MySQL模塊? – kquinn 2009-02-23 09:28:57

13

要按名稱訪問列,請使用Connection實例的row_factory屬性。它可以讓你設置一個函數,其參數爲cursorrow,並返回任何你想要的。有一些內置的pysqlite,即sqlite3.Row,它可以滿足您的要求。

1

SQLite的API支持cursor.description中,所以你可以很容易地做這樣的

headers = {} 
for record in cursor.fetchall(): 
    if not headers: 
     headers = dict((desc[0], idx) for idx,desc in cursor.description)) 
    data.append(record[headers['column_name']]) 

有點長篇大論,但能夠完成任務。我注意到它們甚至在dict_factory下的factory.py文件中。

1

kushal的回答this forum正常工作:

Use a DictCursor:

import MySQLdb.cursors 

. 
. 
. 
cursor = db.cursor (MySQLdb.cursors.DictCursor) 
cursor.execute (query) 
rows = cursor.fetchall() 

for row in rows: 
print row['employee_id'] 

請注意,列名稱區分大小寫。

11

自問題提出並回答之後的五年中,出現了一個非常簡單的解決方案。任何新的代碼都可以簡單地將連接對象與行工廠一起打包。代碼示例:

import sqlite3 

conn = sqlite3.connect('./someFile') 
conn.row_factory = sqlite3.Row  // Here's the magic! 

cursor = conn.execute("SELECT name, age FROM someTable") 
for row in cursor: 
    print(row['name']) 

這裏有一些fine docs。請享用!

相關問題