2009-03-04 3 views
1

pysqliteの使用ユーザ定義型を比較の値として使用するにはどうすればいいですか? g: "... WHERE columnName> userType"?select文のpysqliteユーザタイプ

たとえば、必要な登録、コンバーターなどでbool型を定義しました.Pysqlite/Sqliteは、INSERTおよびSELECT操作(bool 'True'は整数1として格納され、Trueとして返されます)に対して期待どおりに応答します。

boolが "WHERE display = True"または "WHERE display = 'True'というタスクからSELECT *で使用されると失敗します。 "最初のケースでは、SqliteはTrueという名前の列がないというエラーを報告します。 2番目のケースではレコードは返されません。 Trueの代わりに1が使用されている場合、selectが機能します。私は、pysqliteの独自の日付とタイムスタンプアダプタを使用するときに同じ問題があるようです。

私はこの動作と他のユーザータイプでこの問題を回避できますが、それは楽しいものではありません。私は、この特定の壁に私の頭を叩いていないように、クエリでユーザー定義型を使用するかどうかを知りたい、または可能でないかどうかを知りたいと思います。

ありがとうございます。

答えて

0

おそらく、正しいタイプにキャストする必要があります。 "SELECT * FROM tasks WHERE(display = CAST( 'True' AS bool))を試してください。

+0

ありがとう、私はこれを試してみます – Strider1066

1

クエリに変数を渡す正しい方法を使用します。クエリを作成せず、疑問符を使用して、パラメータをタプルとして​​に渡します。

myvar = True 
cur.execute('SELECT * FROM tasks WHERE display = ?', (myvar,)) 

このように、sqliteドライバは値を直接使用します。エスケープ、引用、変換はもう必要ありません。

この方法は、すべてのパラメータ(文字列、整数など)でも使用できます。このようにして、SQL注入を自動的に回避します。

+0

ありがとう、私はこれを試してみます – Strider1066