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

Django从SQLite迁移至MSSQL时的日期验证错误解决求助

解决Django从SQLite迁MSSQL时migrate的日期格式验证错误

问题根源

SQLite对日期格式校验宽松,能接受空字符串作为DateTimeField的值,但MSSQL严格遵循YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]格式,而你的expiration_date字段设置了default=''且blank=False、null=False,迁移时MSSQL无法识别空字符串为合法日期,直接触发验证错误。

解决步骤

1. 修正模型字段的默认值

把所有涉及模型(Jobs、NewUpdates、StudentNoticeBoard、Events、Tender)里的expiration_date字段的default=''替换为合法的日期时间值:

  • 推荐用Django时区工具生成当前时间作为默认值(适配项目时区设置):
from django.utils import timezone

class Jobs(models.Model):
    # 其他字段...
    expiration_date = models.DateTimeField(blank=False, null=False, default=timezone.now)
  • 若需要固定默认日期(比如远未来日期),可以这样写:
from django.utils import timezone
import datetime

class Events(models.Model):
    # 其他字段...
    expiration_date = models.DateTimeField(blank=False, null=False, default=timezone.make_aware(datetime.datetime(2030, 1, 1, 0, 0)))

2. 重新生成迁移并执行

在项目根目录下依次执行命令:

python manage.py makemigrations
python manage.py migrate

3. 处理已有空值数据(若SQLite中存在空字符串记录)

如果之前SQLite数据库里已经有expiration_date为空字符串的记录,需要先过渡处理:

  1. 临时修改字段为null=True:
expiration_date = models.DateTimeField(blank=False, null=True, default=timezone.now)
  1. 执行迁移:
python manage.py makemigrations
python manage.py migrate
  1. 通过Django Shell批量更新空值记录:
python manage.py shell

在Shell中执行:

from django.utils import timezone
from your_app.models import Jobs, NewUpdates, StudentNoticeBoard, Events, Tender

# 逐个模型更新空值
Jobs.objects.filter(expiration_date='').update(expiration_date=timezone.now())
NewUpdates.objects.filter(expiration_date='').update(expiration_date=timezone.now())
# 重复上面的命令处理剩下的模型
  1. 改回字段null=False,再次执行迁移:
expiration_date = models.DateTimeField(blank=False, null=False, default=timezone.now)
python manage.py makemigrations
python manage.py migrate

注意事项

  • 所有涉及的模型必须统一修改,不能遗漏任何一个。
  • 始终使用django.utils.timezone下的方法处理日期,避免时区不匹配导致的后续问题。

内容的提问来源于stack exchange,提问作者Wasi Ur Rehman Qamar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:56:58