5

ここのように、django1.5 とpymysqlを MySQLdb として使用しようとしています。

私の管理コマンドの上部に:

+try:
+    import pymysql
+    pymysql.install_as_MySQLdb()
+except ImportError:
+    pass 

しかし、エラーが発生します:

/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 30, in <module>
    from MySQLdb.converters import conversions, Thing2Literal
ImportError: cannot import name Thing2Literal

それを修正する方法は?

4

2 に答える 2

3

Django 1.5.1 と PyMySQL 0.5 で同じ問題が発生しました

PyMySQL のCMGS フォーク ( https://github.com/CMGS/PyMySQL ) を使用して修正しました。願わくば、これがメインラインの PyMySQL に組み込まれることを願っています。ここで CMGS のプル リクエストを参照してください: https://github.com/petehunt/PyMySQL/pull/106

作成者のコメントとプル リクエストのフィードバックから判断すると、本番環境での使用にはかなり適していると思います。

requirements.txt の行の例: -e git://github.com/CMGS/PyMySQL.git#egg=PyMySQL-dev

于 2013-05-24T22:12:53.123 に答える
2

ではMySQLdbThing2LiteralMySQLの最新バージョンを使用している場合、このメソッドは使用されません。この場合、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にパッチを適用したり、機能をスマートにしたりしなくても、同じ効果を得ることができます。

于 2013-03-09T20:28:21.617 に答える