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
相关产品推荐
相关产品推荐

