TL;DR: python 版本冲突,我认为我下载和编译的 python (3.6) 不能使用这个包 (libmysqlclient-dev) 来迁移到 mysql。只有系统默认的python(3.4)可以。
我的 ubuntu 服务器带有 python 3.4,我所有的 django 工作和其他工作都依赖于 3.6。我了解到升级系统 python 是个坏主意,所以我编译了 python 3.6(使用 altinstall)。
当我运行 python3.6 manage.py migrate 时,它给了我这个 mysql 错误:
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1")
我尝试了虚拟环境和普通的 python 3.6,都给出了同样的错误,我确保安装了 libmysqlclient-dev 和 mysqlclient。
作为this answer建议,问题出在 libmysqlclient-dev 因为它是通过 apt-get 安装的,而不是 pip 所以我猜它只与默认的 python 兼容( 3.4 系统附带的)或我编译的 python 3.6 不允许使用它,因为当我用 python3.4(系统默认)创建一个虚拟 django 项目并尝试 python3.6 manage.py migrate 在同一个用户的同一个 mysql 数据库上,成功了!
AGAIN:我的问题是手动编译的python 3.6不能使用apt-get安装的libmysqlclient-dev,只有3.4可以
引用:Django MySQL error on migrate
更新 我想出了一个变通办法,但效率不高。我将 Django 降级到 2.0.9,它(python manage.py migrate)工作正常。但是这个问题可能会再次出现在不同的包中。
请您参考如下方法:
Django 2.1.* 需要 MySQL 5.6 或更高版本。它通过将 DateTimeField 映射到 datetime(6) 打破了兼容性。
您可以修补 Django MySQL 数据类型映射器。将它放在 settings.py
from django.db.backends.mysql.base import DatabaseWrapper
DatabaseWrapper.data_types['DateTimeField'] = 'datetime' # fix for MySQL 5.5
