当我已经有结果时,如何停止搜索数据库

时间:2012-12-16 08:01:17

标签: python sql

我会发布我的代码并在之后解释,我对所有这些都很陌生:

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的表,有几千个名字,我只想让用户输入一个名字,让它搜索一下这个表,找到一个与输入相匹配的名字,如果名字存在,打印出来必要的信息(如图所示)。但是,对于每个不匹配的名称,它会打印此名称在找到匹配项之前不存在,如果找不到匹配项,我只会收到数千条消息“此名称不存在”。基本上,我希望它搜索表而不打印任何东西,直到它找到名称,如果找到名称,打印出信息,如果它不存在,只需打印一次“这个名称在数据库中不存在” 。

4 个答案:

答案 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'关键字来限制结果集的大小。 这是一种方法,而不是循环可能的大结果集。所以你的方法被打破了。修复您的查询,而不是修改变通方法。当然除此之外:在查询中加入“名称”。