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のマニュアルにはこうあります。


カスタム SQL の実行

connection や cursor は、 PEP 249 で定義さ れている標準的な Python DB-API のほぼ全てに加えて、 Django の トラン ザクション処理 を実装しています。 Python DB-API にあまり詳しくないのなら、パラメタつきの SQL を実行するときに、SQL 文にパラ メタを直接指定して実行するのではなく、 cursor.execute() の SQL 文内でプレースホルダ "%s" を使うことに注意してください。このテクニックを使えば、データベース ライブラリの中で自動的にクオート処理が行われます。 (また、 Django の使って いるプレースホルダ "%s" は、 SQLitePython バインディングで使われて いる "?" と違うということにも注意しましょう。この設計は、一貫性と安全性 に配慮して決められています。)


executeメソッドに、プレースホルダをよきにはからう機能があるとのことです。