【问题标题】:Python SQLite3 / Selecting rows from tablePython SQLite3 / 从表中选择行
【发布时间】:2018-10-09 00:24:44
【问题描述】:
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

但是当结果集中有多达 107 行时,我们无法想象像这样迭代变量 i,然后从中生成一个整数列表。所以,我想知道是否有其他可用的替代解决方案,无论哪种方式都足够直接有效。

【问题讨论】:

  • 你想对结果做什么?为什么需要fetchall()
  • 我正在使用 Python 解决一个名为 Spline 的策略游戏。有多达 107529339 个不同的可能棋盘位置可用,对于每个棋盘位置,我将与其相关的数据存储在 SQLite3 数据库中,以便快速检索棋盘位置是第一个玩家还是第二个玩家获胜。棋盘位置是主键,因此对其进行的任何搜索都会更快。从crsr 的结果集中检索元组列表需要crsr.fetchall()。或者说可以直接从crsr本身的结果集中访问数据项吗?

标签: python list select sqlite tuples


【解决方案1】:

您可以像这样使用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_factoryhere的信息。

【讨论】:

    【解决方案2】:

    您无需拨打fetchall();您可以直接在光标上进行迭代:

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

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

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

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

    【讨论】:

    • for (board,) in crsr.execute("SELECT board FROM ..."): 不会让 SQLite 查询一次又一次地计算它,每次迭代都计算它吗?不是这样吗?
    • 不,forexecute() 调用的结果 上运行。试试for c in raw_input(): print c
    • 感谢您的回复。但是,当您在同一个“for”循环内使用多个 crsr.execute() 语句调用时,此语句(您不需要调用 fetchall();您可以直接在游标上迭代:)并不适用,除非您通过调用诸如crsr1 = connection.cursor()crsr2 = connection.cursor() 之类的语句来使用多个游标语句,或者在两者之间创建中间结果并将其存储到任何给定的临时数据库表中。不是这样吗?
    • 是的,但这个问题与多个execute() 调用无关。
    【解决方案3】:

    几乎没有充分的理由迭代range(len(something))。始终迭代事物本身。

    [row[0] for row in result]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      相关资源
      最近更新 更多