Python 无法使用大小为的DateTime字段创建django表

Python 无法使用大小为的DateTime字段创建django表,python,mysql,django,Python,Mysql,Django,我正在将Django应用程序从本地系统迁移到生产服务器 本地服务器上的配置如下: Django2.2 MySQL 5.7.27-0ubuntu0.16.04.1 mysqlclient-1.4.2.post1 sqlparse-0.3.0 Django2.2 MySQL 5.5.53 mysqlclient-1.4.2.post1 sqlparse-0.3.0 在生产服务器上,配置如下: Django2.2 MySQL 5.7.27-0ubuntu0.16.04.1 mysq

我正在将Django应用程序从本地系统迁移到生产服务器

本地服务器上的配置如下:

Django2.2  
MySQL 5.7.27-0ubuntu0.16.04.1
mysqlclient-1.4.2.post1 
sqlparse-0.3.0
Django2.2  
MySQL 5.5.53
mysqlclient-1.4.2.post1 
sqlparse-0.3.0
在生产服务器上,配置如下:

Django2.2  
MySQL 5.7.27-0ubuntu0.16.04.1
mysqlclient-1.4.2.post1 
sqlparse-0.3.0
Django2.2  
MySQL 5.5.53
mysqlclient-1.4.2.post1 
sqlparse-0.3.0
本地配置和生产配置之间的唯一区别是MySQL服务器版本

有一个型号的代码如下:

class Tracking404Model(models.Model):
    url = models.CharField(max_length=512, null=False, blank=False)
    timestamp = models.DateTimeField(null=False, blank=False)
运行迁移后,我运行commnd
python manage.py sqlmigrate app name迁移文件号
,检查生成的MySQL语法,如下所示:

CREATE TABLE `404_tracking` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
`url` varchar(512) NOT NULL, `timestamp` datetime(6) NOT NULL);
在本地计算机上显示create table语句输出:

mysql> show create table 404_tracking\G
*************************** 1. row ***************************
       Table: 404_tracking
Create Table: CREATE TABLE `404_tracking` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(512) NOT NULL,
  `timestamp` datetime(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
迁移在本地运行得很好,创建了表,我能够执行所有mysql操作。基本上一切都很好

在生产环境中运行迁移时,出现以下错误:

raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc)
django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((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"))
这意味着Django 2.2和mysqlclient 1.4正在尝试创建大小为6的DateTime字段,这会在生产中造成问题

当我试图在终端中直接执行SQL查询时,它显示语法错误:

虽然报告的错误是关于迁移表的,但这看起来像是关于DateTime字段的。迁移表中可能也有DateTime字段,在生产环境中创建迁移表(在应用程序表之前)时会出现问题

另外,几个月前,我在另一个Django应用程序的生产服务器上创建了相同的模型,配置如下:

Django 2.0.6  
MySQL 5.5.53
mysqlclient-1.3.12
No sqlparse module
它被创造得很好。Show create table语句是:

mysql> show create table blog_404_tracking\G
*************************** 1. row ***************************
       Table: blog_404_tracking
Create Table: CREATE TABLE `blog_404_tracking` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(512) NOT NULL,
  `timestamp` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=68040 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
这意味着使用Django 2.0和mysqlclient 1.3.12创建的datetime字段没有长度/大小


如何解决这个问题?

从@Bill Karwin的评论中得到了提示。 根据Django 2.2,它只支持MySQL 5.6及以上版本


在生产服务器上将MySQL的版本从5.5更新到5.7,一切正常。

这与迁移上的sql查询无关,但正如错误所说,与迁移表本身有关。看起来生产数据库可能已经有了一个
django_migrations
表,但不是完全正确的表。@WillemVanOnsem,生产数据库是全新的。没有迁移表。是的,错误是关于迁移表的,但它是关于datetime字段,大小为6。分数秒是MySQL 5.6.4中的一个新特性。MySQL的旧版本不支持这种语法。阅读:您应该始终使用与最终部署到的生产系统相同的软件堆栈来开发项目,以避免此类兼容性意外。这包括运行堆栈每个部分的相同版本。