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-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不能使用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