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

Django重建SQLite数据库后遇OperationalError: unrecognized token: ":"

Django SQLite 报错 django.db.utils.OperationalError: unrecognized token: ":" 解决方法

问题核心原因

你的User模型中使用了PostgreSQL专属字段django.contrib.postgres.fields.ArrayField,但当前项目使用的是SQLite数据库。Django在生成INSERT语句时,会为ArrayField自动添加PostgreSQL专属的类型转换语法?::integer[],而SQLite不识别这种语法,因此抛出unrecognized token: ":"错误。

解决方案

根据你的开发需求,选择以下两种方案之一:

方案1:继续使用SQLite开发

将ArrayField替换为SQLite兼容的字段类型,推荐使用Django内置的JSONField(Django 3.1+支持SQLite),可以直接存储整数数组:

修改User模型代码:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(max_length=150)
    password = models.CharField(max_length=97)
    gender = models.CharField(max_length=6)
    # 替换ArrayField为JSONField,默认空列表
    text_jobs = models.JSONField(default=list, blank=True)
    image_jobs = models.JSONField(default=list, blank=True)
    id = models.CharField(max_length=120, primary_key=True)

    def __str__(self):
        return f"{self.email} , {self.name}"

修改完成后,重新执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

方案2:切换到PostgreSQL数据库

如果项目原本就计划使用PostgreSQL,修改settings.py中的数据库配置为PostgreSQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'your_db_name',
        'USER': 'your_db_user',
        'PASSWORD': 'your_db_password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

配置完成后,创建数据库并执行迁移:

# 创建PostgreSQL数据库(需提前安装PostgreSQL并配置权限)
createdb your_db_name
# 执行迁移
python manage.py makemigrations
python manage.py migrate

注意事项

  • 避免混用数据库专属字段与非对应数据库:Django ORM的跨数据库兼容性仅针对通用字段,专属字段(如PostgreSQL的ArrayField、HStoreField等)只能在对应数据库中使用。
  • 重建数据库后必须重新执行迁移操作,确保表结构与模型定义一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:13:14