1

特定の曜日とその日の特定の時間にあるSQLiteデータベースから行のリストを取得しようとしています。sqliteブラウザを開いてSQLを入力すると:

SELECT * FROM points
WHERE strftime('%H', checkintime) == '12'
  AND strftime('%w', checkintime) == '1'

それは機能し、受け取るべきすべての行を受け取ります。ただし、Pythonでこれを実行しようとすると、次のようになります。

_points.execute("""SELECT * FROM points WHERE strftime('%H', checkintime) == ? AND strftime('%w', checkintime) == ?""", (time, day))

時間は12、日は1の場合、結果はゼロになります。さらに奇妙なのは、executeハードコードされた値を使用するようにステートメントを変更すると、機能することです。

varsをstringsとintsの両方に型キャストしようとしましたが、それでもうまくいきません。:(

助言がありますか?

4

4 に答える 4

1

時間と日の値は文字列である必要があります。また、'%'をエスケープする必要があるかどうか(%%を使用)-pysqlite内で?プレースホルダーが%スタイルのものに変換され、%Hと%wが誤って解釈される可能性があります。次は機能しますか?

_points.execute("""SELECT * FROM points WHERE strftime('%%H', checkintime) == ? AND strftime('%%w', checkintime) == ?""", (str(time), str(day)))
于 2011-03-01T09:56:54.430 に答える
1

数値パラメーターを文字列に変換する必要があると思います。そうしないと、sqlite のステートメントのように引用されません。? による変数置換 は数字を引用しません。

実際には文字列を比較しているので、パラメーターを文字列に変換する必要があります。

于 2011-03-01T09:14:04.863 に答える
0

次のようにしてください: _points.execute("""SELECT * FROM points WHERE strftime('%H', checkintime) == ? AND strftime('%w', checkintime) == ?""" % (時刻, 日) )

%(時間、日)に注意してください

%H と %w についてよくわかりません。時刻と日の形式がわかりません

于 2011-03-01T09:14:30.057 に答える
0

実行呼び出しの外で文字列の書式設定を処理するのはどうですか? 例えば、

sql_statement = """SELECT * FROM points WHERE strftime('%s', checkintime) == %s AND strftime('%s', checkintime) == %s""" % ('%H', time, '%w', day)

_points.execute(sql_statement)

これにより、execute ステートメントで実行できない文字列マッピングを回避できます。

頑張ってください!

于 2011-05-04T08:15:48.987 に答える