PymysqlとDjango2.2の間の非互換性を解決する方法

このメソッドは、GitHubのpymysqlのIsueesから取得されます

operations.py

from django.utils.encoding import force_text

def last_executed_query(self, cursor, sql, params):
    # With MySQLdb, cursor objects have an (undocumented) "_executed"
    # attribute where the exact query sent to the database is saved.
    # See MySQLdb/cursors.py in the source distribution.
    query = getattr(cursor, '_executed', None)
    if query is not None:
        if type(query) == bytes:
            query = query.decode(errors='replace')  # mysqlclient
        elif type(query) == str:
            query = query.encode(errors='replace')   # PyMySQL
        else:
            query = force_text(query, errors='replace')  # fallback compatibility ?
    return query

init .py


from __future__ import print_function
import sys

...

version_info = (1, 3, 12, "final", 0)

...

def install_as_MySQLdb(MySQLdb_version=None):
    """
    After this function is called, any application that imports MySQLdb or
    _mysql will unwittingly actually use pymysql.
    """
    if type(MySQLdb_version) == tuple and len(MySQLdb_version) == 5:
        print("WARNING: Use at your own risk !!\nSet MySQLdb version = {}".format(MySQLdb_version))
        global version_info
        version_info = MySQLdb_version
    sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
>>> import pymysql
>>> pymysql.install_as_MySQLdb(MySQLdb_version=(1, 4, 2, "final", 0))
WARNING: Use at your own risk !!
Set MySQLdb_version = (1, 4, 2, 'final', 0)
>>> pymysql.version_info
(1, 4, 2, 'final', 0)
>>>
元の記事を公開44件 ・いい ね0件 訪問数1226

おすすめ

転載: blog.csdn.net/weixin520520/article/details/105004046
おすすめ