我正在使用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]
答案 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)