转换从fetchall()返回的类型

时间:2013-03-29 21:05:13

标签: python psycopg2

我正在使用psycopg2,我运行以下代码:

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)

这将返回带小数的元组列表:

  

[(十进制('254.000'),),(十进制('154.000'),),(十进制('244.000'),),   (十进制('134.000'),),(十进制('254.000'),)]

如何将其转换为更像:

  

[254.000,154.000,244.000,134.000,254.000]

1 个答案:

答案 0 :(得分:3)

小数是一个与数据库编号类型很好匹配的修正点编号。它们确实很有用,但如果我不能说服你使用它们。

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

会给出

[254.0, 154.0, 244.0, 134.0, 254.0]

甚至更好,因为cur是一个非常容易的

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)