ではMySQLdb
、Thing2Literal
MySQLの最新バージョンを使用している場合、このメソッドは使用されません。この場合、string_literal
接続が使用可能な場合は、代わりに接続のメソッドが使用されます。
pymysql
同じことを行い、接続のメソッドを使用できるようにパッチを適用する必要があります。
コンテクスト
このメソッドは、SQLステートメントをエスケープするために使用されます。その結果、それを回避することには、考慮しなければならないセキュリティの問題があります。
接続のメソッドを使用する理由は、エスケープの役割を果たす文字セットです。
修正ImportError
Thing2Literal
これは非常に簡単な方法で、にダミーメソッドを実装する必要がありますpymysql.converters
。とにかくそれを呼ぶことは決してないので、私たちはそれを気にしません:
def _Thing2Literal(o,d):
"""
Implemented for compatibility with Django.
This function is overriden by the connection's escape method when one is available.
"""
raise NotImplementedError('Thing2Literal is only implemented through the Connection object.')
Thing2Literal = _Thing2Literal
Thing2Literal
接続が利用可能な場合の実行時のモンキーパッチ
にpymysql.connections.Connection
、次を追加します。import pymysql.converters
の最後にpymysql.connections.Connection.__init__
、以下を追加します。
pymysql.converters.Thing2Literal = lambda o, d: self.escape(o)
そして、の最後にpymysql.connections.Connection.__del__
、逆を追加します。
pymysql.converters.Thing2Literal = pymysql.converters._Thing2Literal
d
これは既存の変換のディクショナリであり、メソッドですでに使用可能であるため、引数を破棄できますConnection.escape
。
警告
これが壊れて、セキュリティの問題が発生する可能性は十分にあります。さらに、異なる文字セット
を使用するアクティブな接続が複数ある場合は、ひどく壊れると確信しています。
Djangoで少し遊んで、モンキーパッチが適用されたバージョンが利用可能になっていることを確認する必要があるかもしれません。つまり、名前をモジュールにfrom MySQLdb.converters import Thing2Literal
バインドしているものに置き換えます。Thing2Literal
_Thing2Literal
もちろん、djangoにパッチを適用したり、機能をスマートにしたりしなくても、同じ効果を得ることができます。