我会发布我的代码并在之后解释,我对所有这些都很陌生:
db = sqlite3.connect("Gene.sqlite")
cur = db.cursor()
cur.execute("SELECT * FROM Table")
for i in cur.fetchall():
if i[0] == name:
print '<br>' '<c><b>TYPE'':</b>' ' '+ i[1]+ '<br>'\
'<b>DESCRIPTION:</b></c>' ' '+ i[2]
break
else:
print 'This name does no exist in the Database'
这是在python中,我正在创建一个CGI脚本,用户输入一个名称,我的脚本进入该数据库,搜索名称并打印出该名称的行。我有一个数据库,里面有一个名为Table的表,有几千个名字,我只想让用户输入一个名字,让它搜索一下这个表,找到一个与输入相匹配的名字,如果名字存在,打印出来必要的信息(如图所示)。但是,对于每个不匹配的名称,它会打印此名称在找到匹配项之前不存在,如果找不到匹配项,我只会收到数千条消息“此名称不存在”。基本上,我希望它搜索表而不打印任何东西,直到它找到名称,如果找到名称,打印出信息,如果它不存在,只需打印一次“这个名称在数据库中不存在” 。
答案 0 :(得分:3)
您需要使用WHERE clause
:
db = sqlite3.connect("Gene.sqlite")
cur = db.cursor()
looking_for = 'hello'
cur.execute("SELECT type,description FROM Table WHERE name = '%s'", (looking_for,))
for i in cur.fetchall():
result = '<br><c><b>TYPE:</b> {}<br><b>DESCRIPTION:</b></c> {}'
print result.format(*i)
else:
print '{} does not exist in the Database'.format(looking_for)
答案 1 :(得分:0)
正如Burhan Khalid回答的那样,你可以在SQL中做到这一点,这更好,更快。但是为了完整起见,如果你想将逻辑从SQL区域移动到Python区域,就像你一样,那也应该工作。我相信代码中的问题是name
字段不是索引0字段。尝试打印i[0], i[1], i[2]
并检查是否是这种情况。
现在,也可以通过字段名称来引用列,因此您可以将代码更改为:
if i["name"] == name:
不依赖于索引,因此具有更强大的逻辑。
答案 2 :(得分:-1)
我认为这个问题是一个空白问题。
试试这个
for i in cur.fetchall():
if i[0] == name:
print '<br>' '<c><b>TYPE'':</b>' ' '+ i[1]+ '<br>'\
'<b>DESCRIPTION:</b></c>' ' '+ i[2]
break
else:
print 'This name does no exist in the Database'
另外,你在虚线处错过了一个'+'吗?
答案 3 :(得分:-1)
每个数据库都支持SQL'LIMIT'关键字来限制结果集的大小。 这是一种方法,而不是循环可能的大结果集。所以你的方法被打破了。修复您的查询,而不是修改变通方法。当然除此之外:在查询中加入“名称”。