我使用BaseHttpServer设置了一个基本的python Web服务器,并练习从postgresql数据库中查询数据。一切都很顺利,但我在解析SQL结果时出错了。这是我的代码:
cur=con.cursor()
cur.execute(('select * from stop_times as a, stop_times as b where a.train_id=b.train_id and a.station_name = %s and b.station_name= %s and a.arrival_time < b.arrival_time'), (origin_name, dest_name))
self.wfile.write("Train Number     Starting Station     Destination Station     Departure Time     Arrival Time <br />")
while True:
row=cur.fetchone()
if row==None:
break
print row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8]
for item in row[0]:
self.wfile.write("%s"% item)
self.wfile.write("                      ")
for item in row[3]:
self.wfile.write("%s"% item)
self.wfile.write("              ")
for item in row[8]:
self.wfile.write("%s"% item)
self.wfile.write("       ")
for item in row[2]:
self.wfile.write("%s"% item)
self.wfile.write("   ")
print语句在控制台上进行调试,它给出了正确的输出:
427 10:23:00 10:23:00 San Antonio 6 427 11:08:00 11:08:00 Millbrae
429 11:23:00 11:23:00 San Antonio 6 429 12:08:00 12:08:00 Millbrae
431 12:23:00 12:23:00 San Antonio 6 431 13:08:00 13:08:00 Millbrae
我只是想把某些列输出到网页上,当我到达第[2]行的最后一个for循环时,我得到了这个错误:
File "./caltrainServer.py", line 129, in performQuery
for item in row[2]:
TypeError: 'datetime.timedelta' object is not iterable
我检查了一下,数据库中的那些列属于interval类型。我如何像对其他类型为varchar的列那样迭代它们?
您不必要地对行值的内容进行迭代。像这样的行:
for item in row[0]:
self.wfile.write("%s"% item)
可能更改为
self.wlfile.write(row[0])
当row[x]
是一个字符串时,实际上是在每个字母上迭代并写入它。但row[2]
是一个datetime.datetime对象。由于datetime.datetime对象是不可迭代的,所以您会收到错误消息。
相反,可以尝试以下内容:
self.wlfile.write((row[2]))
这将日期时间对象放在一个可以迭代的元组中。