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

