7

現在、データベースを検索して特定のイベントを取得しようとしています。私のクエリはそのようなものです

SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > '2010-10-01'

簡単に言えば、カレンダーイベントのデータベースを調べて、今月の初め以降に「テスト」を含む要約を含むものを返すクエリが必要です。

これにより、データベース コマンド ラインからクエリを実行すると、期待される結果が返されます。ただし、psycopg2 を使用して Python スクリプトで使用しようとすると、次のようになります。

cursor.execute("SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > %(begin)s ", {'begin' : datetime.datetime(2010,10,1) })

型エラーが出ます

*** TypeError: 'dict' object does not support indexing

最初のグーグルを行うと、ワイルドカードの使用方法に何かのように聞こえます。私は間違っている可能性がありますが、おそらく私には見えない単純なものが欠けています。うまくいけば、コミュニティからの新鮮な目が私の愚かさを正すことができます ;)

4

2 に答える 2

23

これが問題の完全な原因かどうかはわかりませんが、ワイルドカードをエスケープする必要があると思います。そうしないと、パラメーター化ロジックが混乱します。

SELECT * FROM events WHERE summary ILIKE E'%%test%%' AND start_time > %(begin)s 

編集: 10 年以上後、無関係なバグの psycopg2 の問題を調べたところ、開発者がこれを問題として認識していることがわかりました。以下の私のコメントは正しかった。クエリで引数を渡す場合は、LIKE 句のパーセント記号をエスケープする必要があります。引数を渡さない場合は、LIKE 句をエスケープしません。

于 2010-10-15T16:58:47.957 に答える
3

私の推測では、あなたの「%」が python を混乱させているということです。psycopg2 では、ワイルドカード「like」クエリを次のように実行します。


#!/usr/bin/python

import sys,os.path,psycopg2
db=psycopg2.connect("dbname=music")

for line in sys.argv[1::]:
    cursor=db.cursor()
    key="%"+line+"%"
    cursor.execute("select count(*) from pool where path like %s",(key,))
    if cursor.fetchone()[0] != 1:
        sys.stderr.write("ambiguous stem or no such song")
        sys.exit(-1)
    cursor.execute("insert into spool select path from pool where path like %s",(key,))
    cursor.close()
    db.commit()
db.close()

このスクリプトのようなユーザー指定の検索文字列では、おそらく「%」をエスケープしたいと思うでしょう。それ以外の場合は、クエリで正当なワイルドカードになると思われますが、まだそこまで行っていません

于 2011-06-15T20:20:52.577 に答える