Python django 1.5+;pymysql错误:ImportError:无法导入名称Thing2Literal

Python django 1.5+;pymysql错误:ImportError:无法导入名称Thing2Literal,python,django,python-2.7,pymysql,Python,Django,Python 2.7,Pymysql,我尝试使用django1.5和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.

我尝试使用django1.5和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
/local/lib/python2.7/site packages/django/db/backends/mysql/base.py”,第30行,在
从MySQLdb.converters导入转换,Thing2Literal
ImportError:无法导入名称Thing2Literal

如何修复它?

MySQLdb
中,如果您使用的是足够新的MySQL版本,则不使用该方法,在这种情况下,当连接可用时,将使用连接的方法

您需要修补
pymysql
,以便它可以执行相同的操作,并允许您使用连接的方法

上下文

此方法用于SQL语句的逃逸。因此,使用SQL语句时必须考虑安全性问题。

您希望使用连接方法的原因是字符集,它在转义中起作用

修复导入错误 这是一个非常简单的方法,您只需要在中实现一个伪
Thing2Literal
方法。我们永远不会调用它,所以我们不关心它:

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
连接可用时,在运行时进行Monkey patching
Thing2Literal
pymysql.connections.Connection
中,添加:
import pymysql.converters

pymysql.connections.Connection.\uuuu init\uuuu
的末尾,添加以下内容:

pymysql.converters.Thing2Literal = lambda o, d: self.escape(o)
pymysql.connections.Connection.\uu del\uu
的末尾,添加相反的内容:

pymysql.converters.Thing2Literal = pymysql.converters._Thing2Literal
我们可以放弃
d
参数,因为它是现有转换的字典,而
连接.escape
方法已经可以使用这些转换

警告 这很有可能会中断,并暴露安全问题。
此外,我非常确定,如果您有几个使用不同字符集的活动连接,它将严重中断


您可能还需要使用Django,以确保它在可用时使用您的monkey补丁版本-即从MySQLdb替换
。转换器导入Thing2Literal
,使用仍然将
Thing2Literal
名称绑定到模块的内容


当然,您可以在不修补django并使
\u Thing2Literal
功能更智能的情况下实现相同的效果。

在django 1.5.1和PyMySQL 0.5上遇到了相同的问题

通过使用PyMySQL的CMGS fork()进行修复。希望这将进入主线PyMySQL。请参见此处的CMGS的pull请求:

从作者的评论和pull请求中的反馈来看,我认为它对于生产使用来说非常可靠

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

看起来
pymysql
并没有实现
MySQLdb
提供的所有功能(以及Django 1.5需要提供的功能),所以我认为您只是运气不好。下面的评论也提到了您的问题。