在中,如果您使用的是最新版本的 MySQL,则不使用MySQLdb
该方法,在这种情况下,当连接可用时,将使用连接的方法。Thing2Literal
string_literal
您需要进行修补pymysql
,以便它执行相同的操作并让您使用连接的方法。
语境
此方法用于转义 SQL 语句。因此,使用它会产生您必须考虑的安全问题。
之所以要使用connection的方法,是因为charset,起到转义的作用。
修复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
到模块的东西。
你当然可以在不给 django 打补丁并使_Thing2Literal
功能更智能的情况下达到同样的效果。