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

Posted

技术标签:

【中文标题】Django 迁移错误 _mysql_exceptions.ProgrammingError: (1064, "你的 SQL 语法有错误【英文标题】:Django migrate error _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax 【发布时间】:2019-03-14 19:26:15 【问题描述】:

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不能使用apt-get已经安装的libmysqlclient-dev,只有3.4可以

参考:Django MySQL error on migrate

更新 我想出了一个解决方法,但效率不高。我将 Django 降级到 2.0.9 并且它 (python manage.py migrate) 工作。但是这个问题可能会在使用不同的包时再次出现。

【问题讨论】:

您是否尝试过创建虚拟环境并在那里安装mysqlclient? 是的,我已经提到了 你用的是什么版本的mysql?似乎很有可能您拥有的版本不再受 Django 支持。 服务器版本:5.5.61-0ubuntu0.14.04.1 mysql --version: mysql Ver 14.14 Distrib 5.5.61,适用于使用 readline 6.3 的 debian-linux-gnu (x86_64) 【参考方案1】:

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

【讨论】:

【参考方案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 版本:mysql -V 并使用正确的 django 版本。

【讨论】:

pip install django==2.0.* 这个答案刚刚解决了我的问题:***.com/questions/54931065/…【参考方案3】:
from django.db.backends.mysql.base import DatabaseWrapper
DatabaseWrapper.data_types['DateTimeField'] = 'datetime' # fix for MySQL 5.5

解决了我的问题!

感谢 Luka Zakrajšek

【讨论】:

以上是关于Django 迁移错误 _mysql_exceptions.ProgrammingError: (1064, "你的 SQL 语法有错误的主要内容,如果未能解决你的问题,请参考以下文章

_mysql_exceptions 错误(1064,“检查与您的 MySQL 服务器版本相对应的手册,以获取在 'default 附近使用的正确语法)值

_mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')(示

Django 迁移:“0001_initial.py”依赖错误

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2059, "Authentication pl

具有默认值的外键上的 Django 1.7 迁移错误

Django-Memsql 初始迁移错误