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

