3

私は 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)

これは、小数を含むタプルのリストを返します。

[(Decimal('254.000'),), (Decimal('154.000'),), (Decimal('244.000'),), (Decimal('134.000'),), (Decimal('254.000'),) ]

これを次のようなものに変換するにはどうすればよいですか。

[254.000、154.000、244.000、134.000、254.000]

?

4

1 に答える 1

3

10 進数は、データベースの数値型とうまく一致する固定点数です。それらはそのままでも非常に便利ですが、使用するように説得できない場合は.

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

与えるだろう

[254.0, 154.0, 244.0, 134.0, 254.0]

または cur が 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)
于 2013-03-29T21:10:08.210 に答える