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-dev
和mysqlclient
。
正如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
)正常工作。但是使用其他软件包可能会再次出现此问题。
答案 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支持MySQL 5.5及更高版本。
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