2016-05-04 1 views
0

行がすでにテーブルの1つに存在するかどうかを知りたい場合は、この場合はcollです。これを行うために、シェルのSQLiteで少し遊んで、SELECT EXISTS(SELECT 1 FROM coll WHERE ceeb="1234")を見つけました。 SQLiteでは、これは完全に動作し、0または1を返します。これはまさに私が望むものです。だから、コードを手にして、私は私のプログラムにそれを貼り付ける前に、私がこれをうまく動作させることができるかどうかを確認するためのPythonスクリプトを書きました。代わりに、それは私に<sqlite3.Cursor object at 0x01DF6860>ような出力を提供しますceeb_exists1または0を割り当てるのでPythonでSQLiteに行が存在するかどうか確認してください

import sqlite3 

conn = sqlite3.connect('stu.db') 
c = conn.cursor() 

sceeb = int(raw_input(":> ")) 

ceeb_exists = c.execute('SELECT EXISTS(SELECT 1 FROM coll WHERE ceeb="%d" LIMIT 1)' % sceeb) 

print ceeb_exists 

:これは私が思いついたものです。私はここで間違って何をしていますか?

答えて

2

クエリの実行は常に0以上の行で結果。これらの行をフェッチする必要があります。 SELECT EXISTSクエリの結果が1行になるため、その行をフェッチする必要があります。しかし

c.execute('SELECT EXISTS(SELECT 1 FROM coll WHERE ceeb="%d" LIMIT 1)' % sceeb) 
ceeb_exists, = c.fetchone() 

EXISTSクエリは少し冗長で使用して、:あなたはタプルの割り当て(ceeb_exists,カンマに注意してください)を使用することができるように

行は常に、ここであなたは1を取得し、1つのまたは複数の列で構成されここに; のいずれかが返された場合は、行が返されたかどうかをテストできます。 (それは容易にハイジャックされたので、あなたはあなたのceeb値を与えるようにユーザーに求めている)また、SQLインジェクション攻撃を避けるためにクエリパラメータにを使用する必要があります。

c.execute('SELECT 1 FROM coll WHERE ceeb=? LIMIT 1', (sceeb,)) 
ceeb_exists = c.fetchone() is not None 

cursor.fetchone()戻りNoneを利用可能な行がない場合、取得するにはis not NoneテストではTrueまたはFalseになります。

+0

驚異の作品、ありがとう!そして、これは職場での私の使用のためのものなので、私は注射の攻撃について心配する必要はありません。 –

+1

@IanPringle:クエリパラメータを使用することは常に良い方法です。データベースドライバは、そのクエリのために準備された実行計画を作成し、たとえば異なるパラメータに対して再利用することも可能にします。 –

1

.executes()は、わかるようにカーソルオブジェクトを返します。あなたはそれを反復処理する必要があるクエリの結果を印刷するためには :

for result in exists: 
    print result 
+0

これはうまくいきましたが、正規表現やそれを使用可能にするためにデータを少し整理する必要がありました。しかし、私はカーソルオブジェクトについて、それを知らなかった、ありがとう! –

関連する問題