-1

私は自分のコードを投稿し、後で説明します:

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というテーブルを持つデータベースがあります。ユーザーに名前を入力してもらい、テーブルを検索して、入力に一致する1つの名前を見つけてもらいます。名前が存在する場合は、必要な情報(示されているように)。ただし、一致しない名前はすべて、一致するものが見つかるまでこの名前は存在しません。一致するものが見つからない場合は、「この名前は存在しません」というメッセージが何千も表示されます。基本的には、名前が見つかるまで何も印刷せずにテーブルを検索し、名前が見つかった場合は情報を印刷し、存在しない場合は1回だけ印刷してほしい」

4

4 に答える 4

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)
于 2012-12-16T08:10:59.097 に答える
0

Burhan Khalidが答えたように、SQL内でそれを行うことができます。これは、より高速で望ましい方法です。ただし、完全を期すために、ロジックをSQLゾーンからPythonゾーンに移動したい場合は、それも機能するはずです。あなたのコードの問題は、nameフィールドがインデックス0ではないことだと思います。印刷i[0], i[1], i[2]してみて、これが当てはまるかどうかを確認してください。

これで、列の参照はフィールド名でも実行できるため、コードを次のように変更できます。

if i["name"] == name:

インデックスを頼りにせず、したがって、より堅牢なロジックを備えています。

于 2012-12-16T09:12:12.863 に答える
-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'

また、破線で「+」が欠落していますか?

于 2012-12-16T08:05:41.583 に答える
-1

すべてのデータベースは、結果セットのサイズを制限するためにSQL'LIMIT'キーワードをサポートしています。これは、可能性のある大きな結果セットをループする代わりに行う方法です。だからあなたのアプローチは壊れています。回避策をいじくり回す代わりに、クエリを修正してください。そしてもちろん、それとは別に、クエリに「名前」を含めます。

于 2012-12-16T08:08:01.150 に答える