簡體   English   中英

Python SQLite3 /從表中選擇行

[英]Python SQLite3 / Selecting rows from table

board  balls  win1   win2   result
-----  -----  ----   ----   ------
    1      1     0      0        1
    4      1     0      0        1
 1024      1     0      0        1

當我們只從表中選擇一行但是多列時,例如,通過使用:

connection = sqlite3.connect("spline.db")
crsr = connection.cursor()
crsr.execute("SELECT board FROM positions WHERE balls = 1")
result = crsr.fetchall()
print result
connection.close()

結果是一個元組列表:

[(1,), (4,), (1024,)]

有沒有辦法直接獲得整數列表? 一種方法是:

print [result[i][0] for i in range(len(result))]

而不是:

print result

但是,只要結果集中有多達10個7行,我們就無法想象迭代變量i喜歡它,然后從中生成一個整數列表。 所以,我想知道,如果有任何其他替代解決方案可用於它,無論哪種效率都非常直接。

你可以像這樣使用row_factory屬性:

connection = sqlite3.connect("spline.db")
conn.row_factory = lambda cursor, row: row[0]
crsr = connection.cursor()
crsr.execute("SELECT board FROM positions WHERE balls = 1")
result = crsr.fetchall()
print result
connection.close()

這應該給你一個列表,而不是元組。

您可以在此處閱讀有關row_factory更多信息。

你不需要調用fetchall() ; 你可以直接在光標上迭代:

crsr.execute("SELECT ...")
for row in crsr:
    print row[0]

這將按需計算結果行,因此整個列表永遠不需要保存在內存中。

並且您可以進一步簡化: execute()返回游標對象本身,您可以使用元組賦值從行中提取值:

for (board,) in crsr.execute("SELECT board FROM ..."):
    print board

迭代range(len(something))幾乎沒有理由range(len(something)) 總是迭代事物本身。

[row[0] for row in result]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM