Django迁移错误_mysql_exceptions.ProgrammingError:(1064,“您的SQL语法有错误

时间:2018-10-09 23:58:54

标签: python django python-3.x virtualenv mysql-python

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,“您的SQL语法有错误;请检查与MySQL服务器版本相对应的手册,以在第1行的'(6)NOT NULL)'附近使用正确的语法”)

我尝试了虚拟环境和普通的python 3.6,两者都给出了相同的错误,并且我确保安装了libmysqlclient-devmysqlclient

正如this answer所暗示的那样,问题出在libmysqlclient-dev上,因为它是通过apt-get而不是pip安装的,所以我猜它只与默认的python(3.4随附)兼容。系统)或我编译的python 3.6不允许使用它,因为当我使用python3.4(系统的默认值)创建了一个虚拟django项目并尝试以同一用户在同一MySQL数据库上使用python3.6 manage.py migrate时,工作了!

再次:我的问题是手动编译的python 3.6无法使用libmysqlclient-dev已安装的apt-get,只有3.4可以

参考:Django MySQL error on migrate

更新 我想出了一个解决方法,但是效率不高。我将Django降级为2.0.9,它(python manage.py migrate)正常工作。但是使用其他软件包可能会再次出现此问题。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

django 2.0.*django 2.1.*的支持有很大的不同

按照Django 2.0.* MySQL Notes

  

Django支持MySQL 5.5及更高版本。

按照Django 2.1.* MySQL Notes

  

Django支持MySQL 5.6和更高版本。

使用mysql -V检查您的MySQL版本,并使用正确的Django版本。

答案 2 :(得分:0)

from django.db.backends.mysql.base import DatabaseWrapper
DatabaseWrapper.data_types['DateTimeField'] = 'datetime' # fix for MySQL 5.5

解决了我的问题!

感谢LukaZakrajšek