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

如何在Django的SQLite数据库中正常使用UUIDField?

根因分析

PostgreSQL原生支持uuid数据类型,可直接接收Python UUID对象作为查询参数;但SQLite驱动没有内置UUID类型适配,你在_get_next_tree_id方法中直接返回UUID实例时,SQLite无法将其绑定到查询参数,因此抛出类型不支持错误。

解决方案

优先采用以下第一种方案,改动最小兼容性最好:

方案1:统一返回UUID十六进制字符串

仅需修改_get_next_tree_id方法的返回值,将UUID对象转为32位无分隔符的十六进制字符串即可,Django的UUIDField会自动适配PostgreSQL和SQLite两种数据库的存储逻辑:

import uuid

class AsyncSafeTreeManager(TreeManager):
    def _get_next_tree_id(self):
        if (
            "test" in sys.argv or "test_coverage" in sys.argv
        ):  # Covers regular testing and django-coverage
            # hex属性直接返回32位无分隔符的UUID字符串,比replace写法更规范
            return uuid.uuid4().hex
        # 若generate_ulid_as_uuid返回的是UUID对象,也同步转成hex格式
        return generate_ulid_as_uuid().hex

方案2:给SQLite注册UUID类型适配

如果不想改动业务代码,可以在测试数据库配置中新增SQLite的UUID类型转换规则,同样可解决问题:
首先在settings.py中修改测试相关的数据库配置:

import sys
import sqlite3
import uuid

# 原有数据库配置
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        # ...
    }
}

if (
    "test" in sys.argv or "test_coverage" in sys.argv
):
    DATABASES["default"]["ENGINE"] = "django.db.backends.sqlite3"
    # 新增SQLite UUID适配配置
    DATABASES["default"]["OPTIONS"] = {
        "detect_types": sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES
    }
    # 注册UUID的适配器和转换器
    sqlite3.register_adapter(uuid.UUID, lambda u: u.bytes)
    sqlite3.register_converter("UUID", lambda b: uuid.UUID(bytes=b))
注意事项
  • 不要手动生成带分隔符的UUID字符串传入UUIDField,Django内部会自动处理格式转换,统一使用UUID对象的hex属性返回值兼容性最好。
  • 两种方案都不会影响PostgreSQL环境的原有逻辑,可放心使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:39:03