AttributeError:“UUID”对象在使用后端不可知的 GUID 类型时没有属性“replace”

新手上路,请多包涵

我想在使用 SQLAlchemy 1.1.5 的 Postgresql 数据库中有一个类型为 uuid 的主键 ID,并使用 pg8000 适配器连接到数据库。我使用了 SQLAlchemy 文档中的与 后端无关的 GUID 类型 配方

当我想插入数据库时,出现以下错误

  File ".../guid.py", line ???, in process_result_value
    return uuid.UUID(value)
  File "/usr/lib/python2.7/uuid.py", line 131, in __init__
    hex = hex.replace('urn:', '').replace('uuid:', '')
AttributeError: 'UUID' object has no attribute 'replace'

我的模型看起来像这样

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from guid import GUID
import uuid

base = declarative_base()

class Item(base):
    __tablename__ = 'item'

    id = Column(GUID(), default=uuid.uuid4, nullable=False, unique=True, primary_key=True)
    name = Column(String)
    description = Column(String)

    def __repr__(self):
        return "<Item(name='%s', description='%s')>" % (self.name, self.description)

我的资源或控制器看起来像这样

data = req.params
item = Item(name=data['name'], description=data['description'])

self.session.add(item)
self.session.commit()

原文由 The Oracle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 953
2 个回答

pg8000 PostgreSQL 数据库适配器正在返回一个 uuid.UUID() 对象(请参阅它们的 类型映射文档,SQLAlchemy 已将其传递给 TypeDecorator.process_result_value() 方法

然而,文档中给出的实现需要一个 string ,所以失败了:

 >>> import uuid
>>> value = uuid.uuid4()
>>> uuid.UUID(value)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python2.7/uuid.py", line 133, in __init__
    hex = hex.replace('urn:', '').replace('uuid:', '')
AttributeError: 'UUID' object has no attribute 'replace'

快速的解决方法是强制该值无论如何都是一个字符串:

 def process_result_value(self, value, dialect):
    if value is None:
        return value
    else:
        return uuid.UUID(str(value))

或者您可以先测试类型:

 def process_result_value(self, value, dialect):
    if value is None:
        return value
    else:
        if not isinstance(value, uuid.UUID):
            value = uuid.UUID(value)
        return value

我已经提交了 pull request #403 来修复文档中的这个问题(合并后)。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题