2013-03-29 61 views
2

我使用psycopg2的,我運行下面的代碼:轉換類型從使用fetchall()返回

conn = psycopg2.connect(database = mydb_name, host = mydb_server, user = mydb_uname, password = mydb_pwd) 
cur = conn.cursor() 
cur.execute("SELECT desiredParams FROM tableOfInterest;") 
all_data = cur.fetchall() 
nlargest = heapq.nlargest(5, all_data) 

這將返回的元組與小數列表:

[(十進制(」 (十進制('244.000')),(十進制('244.000'),),(十進制('244.000'),),(小數('134.000')),(十進制('254.000'),)]

如何將其轉換爲更類似於以下內容的文件:

[254.000,154.000,244.000,134.000,254.000]

+1

你想字符串的方法是什麼? – kindall

+0

否;我想要漂浮物。 – jml

回答

2

小數是一個與數據庫數字類型非常匹配的定點數。他們真的很有用,但如果我不能說服你使用它們。

largest = [float(d[0]) for d in nlargest] 

會給

[254.0, 154.0, 244.0, 134.0, 254.0] 

,甚至更好,因爲薑黃素是一種iterible

cur.execute("SELECT desiredParams FROM tableOfInterest;") 
nlargest = [float(g[0]) for g in heapq.nlargest(5, cur)] 

在試圖讓它非常

cur.execute("SELECT param FROM tableOfInterest ORDER BY param DESC FIRST 5;") 
nlargest = [float(r.param) for r in cur] 

或跳過列表建設只是做

cur.execute("SELECT param FROM tableOfInterest ORDER BY param DESC FIRST 5;") 
for param, in cur: 
    stuff_to_do_with_first_5(float(param)) 

綁定的方式看起來不錯,但真的很糟糕(由於pyscopg對綁定變量的處理不當)。這個問題是,pysco只是%的值到字符串中,因此隱藏了將sql注入字符串的能力。

cur.execute("SELECT param FROM tableOfInterest ORDER BY param DESC FIRST %s;", (num_results,)) 

,看起來不好,但更安全,則以前

cur.execute("SELECT param FROM tableOfInterest ORDER BY param DESC FIRST %d;" % num_results) 
+0

你是什麼意思'考慮行在數據庫中的數據類型'?數據庫不是我的;我無法更改格式。我想要做的就是轉換到上面列出的列表。 – jml

+0

@jml不夠公平,只是使用float而不是str。 (編輯) – cmd

+1

這真的是最優雅的?我認爲有像tofloatlist(myweirdlist)內置的東西...也許不是 – jml

相關問題