2013-09-24 58 views
0

問題:我找不出如何以正確的方式運行查詢,以便返回映射的字典。該查詢將使用來自多個表的計數。根據多個查詢返回映射的字典

我正在使用psycopg2作爲postgresql數據庫,我將使用這些結果來創建一個關於這些計數的日常增量報告。

鑑於此,有人可以提供一個關於如何執行多個查詢並返回一個可用於比較目的的字典的例子嗎?謝謝!我在for循環中的圖像需要在這裏的某處。

tables = ['table1', 'table2'] 
def db_query(): 
    query = "select count(*) from (a_table) where error_string != '';" 
    conn = psycopg2.connect(database=db, user=user, password=password, host=host) 
    cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) 
    cur.execute(query, tables) 
    output = cur.fetchall() 
    conn.close() 
    return output 

回答

1

我沒有使用PostgreSQL數據庫,所以你可能要還檢查了這一點作爲參考:How to store count values in python

這就是說,重新安排你的代碼到這樣的東西。請務必conn全球化,所以你不必做一個以上的連接,並確保你也關閉cur

conn = None  

def driverFunc(): 
    global conn 
    try: 
     conn = psycopg2.connect(database=db, user=user, password=password, host=host) 
     tables = ['table1', 'table2'] 
     countDict = {} 
     for thisTable in tables: 
      db_query(thisTable, countDict) 
    finally: 
     if not conn == None: 
      conn.close() 

def db_query(tableName, countDict): 
    # Beware of SQL injection with the following line: 
    query = "select count(*) from " + tableName + " where error_string != '';" 
    cur = None 

    try: 
     cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) 
     cur.execute(query) 
     countDict[tableName] = int(cur.fetchone()) 
    finally: 
     if not cur == None: 
      cur.close() 
+0

感謝。需要注意的是,psycopg2模塊文檔在運行查詢時強烈建議針對字符串連接。 [Psycopg2文檔](http://initd.org/psycopg/docs/usage.html) –

+0

我想你已經注意到了這一點。 –

+0

這最終是超級有用的,我不是很想弄清楚在查詢中替換字符串連接的「正確」方式,但由於它不會被公開,所以這應該就足夠了。謝謝! –