首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >psycopg2.errors.UndefinedFunction运算符不存在: uuid = text

psycopg2.errors.UndefinedFunction运算符不存在: uuid = text
EN

Stack Overflow用户
提问于 2022-01-19 16:45:44
回答 1查看 1.1K关注 0票数 0

我使用烧瓶Sqlalchemy和Postgres,并试图筛选出模型的所有实例,其中json数据列的一个字符串值等于另一个(UUID4)列。

代码语言:javascript
复制
class MyModel (db.Model):
id = db.Column(UUID(as_uuid=True), primary_key=True,
                   index=True, unique=True, nullable=False,
                   server_default=sa_text("uuid_generate_v4()"))
site = db.Column(UUID(as_uuid=True), db.ForeignKey(
        'site.id'), index=True, nullable=False)
data = db.Column(JSON, default={}, nullable=False)

这些模型的数据列看起来就像

代码语言:javascript
复制
{
    "cluster": "198519a5-b04a-4371-b188-2b992c25d0ae",
    "status": "Pending"
}

这就是我想要的:

filteredModels = MyModel.query.filter(MyModel.site == MyModel.data['cluster'].astext)

我得到:

代码语言:javascript
复制
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedFunction) operator does not exist: uuid = text
LINE 4: ...sset.type = 'testplan' AND site_static_asset.site = (site_st...
                                                             

HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-19 18:16:16

错误消息告诉您Postgresql没有直接比较UUID和文本值的方法。换句话说,它不能处理

代码语言:javascript
复制
MyModel.site == MyModel.data['cluster'].astext

为了解决这一问题,您需要将比较的一边与另一侧进行投射,使其类型相同。这两种方法中的任何一种都应起作用:

代码语言:javascript
复制
from sqlalchemy import cast, String

MyModel.query.filter(cast(MyModel.site, String) == MyModel.data['cluster'].astext)

MyModel.query.filter(MyModel.site == cast(MyModel.data['cluster'].astext, UUID))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70774530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档