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

使用mssql+pytds查询SQL Server时UUID对象replace属性错误求助

问题解决方法

问题根源是sqlalchemy_pytds驱动将SQL Server的UNIQUEIDENTIFIER字段直接转换为Python的UUID对象,但SQLAlchemy后续处理时又将该对象传入uuid.UUID构造函数,而该构造函数仅接受字符串参数,导致触发replace属性错误。以下是几种可行的解决方式:

1. 自定义字段类型装饰器

编写TypeDecorator包装原生UNIQUEIDENTIFIER类型,重写结果转换逻辑,确保返回字符串格式:

from sqlalchemy import TypeDecorator
from sqlalchemy.dialects.mssql import UNIQUEIDENTIFIER
import uuid

class StringUUID(TypeDecorator):
    impl = UNIQUEIDENTIFIER

    def process_result_value(self, value, dialect):
        if isinstance(value, uuid.UUID):
            return str(value)
        return value

# 修改Orders表的id字段定义
class Orders(Base):
    __tablename__ = 'Orders'
    id = Column(StringUUID, unique=True, nullable=False, primary_key=True)
    ...

2. 临时补丁修改驱动类型处理逻辑

找到sqlalchemy_pytds安装目录下的types.py文件(通常路径为Lib\site-packages\sqlalchemy_pytds\types.py),修改UNIQUEIDENTIFIER类的结果处理器:
原代码:

class UNIQUEIDENTIFIER(MSSQLUniqueIdentifier):
    def result_processor(self, dialect, coltype):
        def process(value):
            if value is not None:
                return uuid.UUID(value)
            return value
        return process

修改为:

class UNIQUEIDENTIFIER(MSSQLUniqueIdentifier):
    def result_processor(self, dialect, coltype):
        def process(value):
            if value is not None:
                return str(uuid.UUID(value))
            return value
        return process

3. 调整库版本兼容性

尝试升级sqlalchemy_pytds到最新版本,或降级python_tds版本,排查版本兼容问题:

pip install --upgrade sqlalchemy_pytds

也可结合as_uuid=False显式指定字段参数:

id = Column(mssql.UNIQUEIDENTIFIER(as_uuid=False), unique=True, nullable=False, primary_key=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:16:18