DjangoでカスタムSQLを使う場合のプログラム
Djangoで自作のカスタムSQLを発行する場合の関数について、調べてみます。
DjangoにはカスタムSQLを使うモジュールが用意されています。
通常のSQLだと味がないので、MATCH AGAINSTの全文検索を図る場合を書いてみます。
groongaのテキスト検索などもこの文でいけます。
classなどに組み込んで使う場合を想定しています。
こんな感じになります。
from django.db import connection def sql_fnc(self): cursor = connection.cursor() cursor.execute("SELECT * FROM hoge WHERE MATCH (huga) AGAINST (%s IN BOOLEAN MODE)",[self.search_word]) data = cursor.fetchone() return data
バインド機能であるプレースホルダ(%s)は必ず設定してください。
一定のSQLインジェクション等の対策になります。
なお使用する場合は、自己責任でお願いします。
参考:カスタムSQL
カスタムSQLの使い方について、Djangoのマニュアルにはこうあります。
connection や cursor は、 PEP 249 で定義さ れている標準的な Python DB-API のほぼ全てに加えて、 Django の トラン ザクション処理 を実装しています。 Python DB-API にあまり詳しくないのなら、パラメタつきの SQL を実行するときに、SQL 文にパラ メタを直接指定して実行するのではなく、 cursor.execute() の SQL 文内でプレースホルダ "%s" を使うことに注意してください。このテクニックを使えば、データベース ライブラリの中で自動的にクオート処理が行われます。 (また、 Django の使って いるプレースホルダ "%s" は、 SQLite の Python バインディングで使われて いる "?" と違うということにも注意しましょう。この設計は、一貫性と安全性 に配慮して決められています。)
executeメソッドに、プレースホルダをよきにはからう機能があるとのことです。