Python SQLite3 /从表中选择行

时间:2018-04-28 08:38:01

标签: python list select sqlite tuples

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,然后创建一个整数列表。它。所以,我想知道,如果有任何其他替代解决方案可供选择,那么非常有效。

3 个答案:

答案 0 :(得分:4)

您可以使用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 here

答案 1 :(得分:2)

您无需致电fetchall();你可以直接在光标上迭代:

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

这将按需计算结果行,因此整个列表永远不需要保存在内存中。

你可以进一步简化:execute()返回游标对象本身,你可以使用元组赋值从行中提取值:

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

答案 2 :(得分:1)

几乎没有理由迭代range(len(something))。总是迭代事物本身。

[row[0] for row in result]