在 Django 2.2 中使用 MySQL

发布于 2022-09-01 12:07:01 字数 2111 浏览 95 评论 0

Django2 使用 MySQL 稍复杂一些。这是因为 Django 从 2.0 开始不再支持 Python2,只支持 Python3。但 MySQLdb 不支持 Python3。所以需要支持 Python3 的 PyMySQL 伪装 MySQLdb。伪装后还有些小问题,需要改源码。

准备

pip install pymysql

配置

settings.py

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }

    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'defpy',
        'PASSWORD': 'defpy.com',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

init.py

import pymysql
pymysql.install_as_MySQLdb()  # 兼容mysqldb

Bug

使用 PyMySQL 伪装 MySQLdb 的方案后会有 2 个 bug,需要修改源码解决,修改安装包源码的方案不可取,但暂时没啥好办法先这样用吧。

mysqlclient 版本过低

异常信息:

  File "/Users/defpy/.local/share/virtualenvs/defpy.com-eAiAjDFX/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 36, in 
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

解决办法:打开这个文件注释掉 最低版本限制的判断

# if version < (1, 3, 13):
#     raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

str 类型没有 decode 方法

异常信息:

    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "/Users/defpy/.local/share/virtualenvs/defpy.com-eAiAjDFX/lib/python3.7/site-packages/django/db/backends/mysql/operations.py", line 146, in last_executed_query
    query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'

解决办法:decode 改为 encode

# query = query.decode(errors='replace')
query = query.encode(errors='replace')

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

烙印

文章 0 评论 0

singlesman

文章 0 评论 0

独孤求败

文章 0 评论 0

晨钟暮鼓

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文