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

Django中字符串转uniqueidentifier失败,SQL Server插入报错如何解决?

解决Django ORM插入SQL Server GUID时的字符转uniqueidentifier错误

以下是针对你遇到问题的具体排查和解决步骤:

1. 先严格清洗源GUID字符串格式

SQL Server的uniqueidentifier类型对格式要求非常严格,只接受36位带连字符(如xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)或32位无连字符的UUID字符串。如果源数据entry.projuid带有多余字符(比如花括号{}、方括号[]),或者格式不规范,哪怕转成UUID对象也会在插入时触发转换错误。

先对源字符串做清洗处理:

# 移除可能的冗余符号,统一格式
cleaned_guid = entry.projuid.strip('{}[]').replace('-', '')
# 若为32位无连字符格式,转回标准带连字符格式(UUID对象兼容两种,但SQL Server更适配标准格式)
if len(cleaned_guid) == 32:
    cleaned_guid = f"{cleaned_guid[:8]}-{cleaned_guid[8:12]}-{cleaned_guid[12:16]}-{cleaned_guid[16:20]}-{cleaned_guid[20:]}"
# 再转换为UUID对象
project_guid = uuid.UUID(cleaned_guid)

2. 检查数据库驱动与配置

确保使用官方推荐的mssql-django驱动(替代旧的django-pyodbc-azure),并在settings.py中配置正确的数据库参数,保证UUID与SQL Server的uniqueidentifier正确映射:

DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': '你的数据库名',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': '数据库地址',
        'PORT': '1433',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            # 开启数据类型兼容性,解决UUID映射问题
            'extra_params': 'DataTypeCompatibility=80',
        },
    }
}

3. 排查bulk_create的批量插入问题

SQL Server的批量插入偶尔会因驱动参数绑定逻辑出现异常,你可以先测试单条插入,确认是否是批量操作导致的问题:

# 先测试单条数据插入
test_entry = data[0]
cleaned_guid = test_entry.projuid.strip('{}[]')
KmList.objects.create(
    project_guid=uuid.UUID(cleaned_guid),
    km_no=test_entry.projectname,
    old_id=None,
    kp_name=test_entry.kp_name,
    rev_name=test_entry.nameproject,
    chief_name=test_entry.projectownername,
    department=test_entry.department,
)

如果单条插入成功,说明批量操作需要调整:可以限制批量大小,或者显式指定插入字段:

# 分批次插入,每次50条
batch_size = 50
for i in range(0, len(km_objects), batch_size):
    batch = km_objects[i:i+batch_size]
    KmList.objects.bulk_create(
        batch,
        fields=['project_guid', 'km_no', 'old_id', 'kp_name', 'rev_name', 'chief_name', 'department']
    )

4. 显式指定模型字段的数据库类型

虽然UUIDField默认会映射到SQL Server的uniqueidentifier,但可以显式声明字段类型,避免Django自动生成的SQL出现偏差:

class KmList(models.Model):
    project_guid = models.UUIDField(
        primary_key=True,
        db_type='uniqueidentifier'
    )
    # 其他字段...

修改后运行makemigrations和migrate,确认数据库中该字段的类型确实为uniqueidentifier。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:25:37