我正在编写一个脚本,将一堆csv文件格式化为一个csv文件。
为此,我通过sqlite在python中使用了几个游标表。
这是我的代码 - 目前我只想尝试获取与gsap_locs中的代码相关联的gsap中的每一行进行打印
data = c.execute("SELECT * from gsap_locs")
for row in data:
print row[0]
d2 = c.execute("select date, cardtype, volume, transactions from gsap where gsaploc=?", (row[0],))
for r2 in d2:
print r2
但是,我的代码只返回一行。我知道问题不在第一个for
中,因为当我在print row[0]
之后取出所有内容时,它会打印出第一个选择中的所有值。
为什么在没有满足第一个条件的情况下,在我的第二次跑步之后逃脱了我的第一次?
答案 0 :(得分:2)
看起来cursor.execute
只能跟踪一个操作/一次返回一个迭代器。您可能希望将第一个操作的结果保留在内存中,并在其上调用tuple
:
data = tuple(c.execute("SELECT * from gsap_locs"))
for row in data:
...
确保有足够的内存来容纳第一个查询的所有结果。
答案 1 :(得分:2)
您遗漏了fetchall
或fetchone
指示
这很常见,我们认为execute
已经完成了获取数据的工作,但您应该使用fetch
。
要在执行SELECT语句后检索数据,可以将游标视为迭代器,调用游标的fetchone()方法以检索单个匹配行,或调用fetchall()以获取匹配行的列表。
import sqlite3
conn = sqlite3.connect('gasp.sqlite')
c = conn.cursor()
c.execute("SELECT * FROM gsap_locs")
rows = c.fetchall()
for row in rows:
print row[0]
c.execute("select * from gsap where loc=?", (row[0],))
d2 = c.fetchall()
for r2 in d2:
print r2
conn.close()