我不确定如何解决这个问题:我的SQLite3数据库中有三个表,当我尝试在fetchone()
的for循环中访问它们时,table1的数据行不显示,但我的表3的数据行使用for循环和fetchone()
显示得很好。 fetchall()
是唯一可以访问table1中数据的方法,fetchall()
也适用于table3。我只在table1和3个文本列中有一行数据,在table3和6个文本列中只有很多行数据。显示的此交互模式示例表现出与我的非交互式脚本编写相同的问题:
>>> cur.execute('select * from ' + tablename1)
<sqlite3.Cursor object at 0x021A3420>
>>> print '\n'+str(cur.fetchall())
[(u'OMAHA / COUNCIL BLUFFS, NEBRASKA, US', None, u'green')]
>>> cur.execute('select * from ' + tablename1)
<sqlite3.Cursor object at 0x021A3420>
>>> for row in cur:
... data = cur.fetchone()
... print data
...
None
>>> cur.execute('select * from '+tablename1)
<sqlite3.Cursor object at 0x021A3420>
>>> cur.execute('PRAGMA table_info('+tablename1+')')
<sqlite3.Cursor object at 0x021A3420>
>>> data = cur.fetchall()
>>> for d in data:
... print d[0], d[1], d[2]
...
0 REGIONUPPERCASE TEXT
1 REGION TEXT
2 REDGREEN TEXT
>>> cur.execute('select * from '+tablename3)
<sqlite3.Cursor object at 0x021A3420>
>>> cur.execute('PRAGMA table_info('+tablename3+')')
<sqlite3.Cursor object at 0x021A3420>
>>> data = cur.fetchall()
>>> for d in data:
... print d[0], d[1], d[2]
...
0 REGIONUPPERCASE TEXT
1 REGION TEXT
2 REDGREEN TEXT
3 COORDSLAT TEXT
4 COORDSLONG TEXT
5 CLHREF TEXT
>>> cur.execute('select * from ' + tablename3)
<sqlite3.Cursor object at 0x021A3420>
>>> for row in cur:
... data = cur.fetchone()
... print data
...
(u'BIRMINGHAM, ALABAMA, US', u'birmingham, Alabama, US', u'red', u'33.5206608', u'-86.80249', u'
(u'FLORENCE / MUSCLE SHOALS, ALABAMA, US', u'florence / muscle shoals, Alabama, US', u'red', u'3
(u'HUNTSVILLE / DECATUR, ALABAMA, US', u'huntsville / decatur, Alabama, US', u'red', u'34.72849'
(u'MONTGOMERY, ALABAMA, US', u'montgomery, Alabama, US', u'red', u'32.3668052', u'-86.2999689',
(u'ANCHORAGE / MAT-SU, ALASKA, US', u'anchorage / mat-su, Alaska, US', u'red', u'61.340307', u'-
(u'KENAI PENINSULA, ALASKA, US', u'kenai peninsula, Alaska, US', u'red', u'59.8785222', u'-150.3
(u'FLAGSTAFF / SEDONA, ARIZONA, US', u'flagstaff / sedona, Arizona, US', u'red', u'34.8262376',
就像我说的那样,fetchall()
适用于table3,我只是没有在这里发布那个输出。到目前为止我还没有得到table2(这是一个新创建的数据库,我还没有完全正常运行)所以现在让我们不要担心table2。它将更类似于table1而不是table3。换句话说,tables1和2列架构是table3列架构的子集。
我想知道其中的表或数据是否正在被破坏。那可能吗。这对我来说似乎很奇怪。我不知道如何解决这个或从哪里开始,所以我向任何可以寻求帮助的人提供帮助。
感谢大家对他人的帮助!
答案 0 :(得分:2)
您正在光标上循环。这会产生数据已经。当您致电fetchone()
时,该行已经投放。
只需使用循环变量,它在迭代时包含每一行结果:
cur.execute('select * from ' + tablename1)
for row in cur:
print row
你的tablename3
循环只看到一半的行;你通过迭代获取一行,忽略该行,用cur.fetchone()
获取下一行并打印那一行,在循环中重复该过程。
使用迭代或 fetchone()
和fetchall()
。不要混淆两者。
fetchone()
将仅用于获取一个结果行,例如:
cur.execute('select * from ' + tablename1 + ' WHERE unique_column=?', ('somevalue',))
row = cur.fetchone()
if row is not None:
# there was a matching row, rejoice
print row