You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django部署到Linux+MySQL时迁移报错:make_aware expects a naive datetime

Django迁移MySQL时出现ValueError: make_aware expects a naive datetime的解决方法

问题场景

本地SQLite环境运行正常的Django应用,部署到Linux服务器使用MySQL后端时,首次执行python3 manage.py migrate出现如下错误:

(env-bulkmailer) [root@localhost bulkmailer]# python3 manage.py migrate
Traceback (most recent call last):
  File "/var/www/bulkmailer-folder/bulkmailer/manage.py", line 22, in <module>
    main()
  File "/var/www/bulkmailer-folder/bulkmailer/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/core/management/__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/core/management/base.py", line 402, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/core/management/base.py", line 448, in execute
    output = self.handle(*args, **options)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/core/management/base.py", line 96, in wrapped
    res = handle_func(*args, **kwargs)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/core/management/commands/migrate.py", line 114, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/migrations/loader.py", line 58, in __init__
    self.build_graph()
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/migrations/loader.py", line 235, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/migrations/recorder.py", line 82, in applied_migrations
    return {
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/models/query.py", line 394, in __iter__
    self._fetch_all()
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/models/query.py", line 1866, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/models/query.py", line 117, in __iter__
    for row in compiler.results_iter(results):
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/models/sql/compiler.py", line 1336, in apply_converters
    value = converter(value, expression, connection)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/db/backends/mysql/operations.py", line 331, in convert_datetimefield_value
    value = timezone.make_aware(value, self.connection.timezone)
  File "/var/www/bulkmailer-folder/env-bulkmailer/lib64/python3.9/site-packages/django/utils/timezone.py", line 291, in make_aware
    raise ValueError("make_aware expects a naive datetime, got %s" % value)
ValueError: make_aware expects a naive datetime, got 2022-11-20 12:39:18.866299+00:00

已完成配置:

  • settings.py中设置USE_TZ = True
  • 执行过mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql导入时区表
  • 当前环境:Django 4.1.3、MySQL Community 8.0.30

解决方案

1. 更新mysqlclient版本

Django 4.1.x需要兼容的mysqlclient版本(建议≥2.1.0),旧版本处理带时区的datetime时存在兼容问题,执行以下命令更新:

pip install --upgrade mysqlclient

2. 配置数据库连接时区参数

在settings.py的DATABASES配置中,添加init_command将连接时区设置为UTC(匹配USE_TZ=True的默认时区):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '你的数据库名',
        'USER': '你的数据库用户',
        'PASSWORD': '你的数据库密码',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES', time_zone='+00:00'",
        },
        'TIME_ZONE': 'UTC',
    }
}

3. 修正MySQL全局时区设置

登录MySQL控制台,检查当前全局时区:

SELECT @@global.time_zone;

若返回值不是+00:00或UTC,执行以下命令修改:

SET GLOBAL time_zone = '+00:00';

同时修改MySQL配置文件my.cnf(或my.ini),添加或修改:

[mysqld]
default-time-zone = '+00:00'

修改后重启MySQL服务:

systemctl restart mysqld

4. 清理残留迁移记录表(若首次迁移前已有错误创建的表)

如果之前尝试迁移失败后,数据库中已存在django_migrations表,先删除该表再重新迁移:

DROP TABLE IF EXISTS django_migrations;

然后重新执行迁移命令:

python3 manage.py migrate

内容的提问来源于stack exchange,提问作者Samrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:40:32