【问题标题】:Sql Alchemy can't cast jsonb to booleanSql Alchemy 无法将 jsonb 转换为布尔值
【发布时间】:2017-07-07 07:10:37
【问题描述】:

我从模型中提取以下值,并尝试转换为布尔值。但是,当我运行该程序时,我收到一条错误消息,指出“无法将 jsonb 类型转换为布尔值。这里的jsonb值是布尔值,为什么不能强制转换呢?我需要改变什么?

我要获取的数据值是 {"unsubscribe" : "True"} 的布尔值

这是导致错误的行。

args.append(Customer.data['unsubscribed'].cast(sqlalchemy.Boolean) == "{}".format(True))

这是客户模型

class Customer(Base):
    __tablename__ = 'customers'
    id = Column(UUID, primary_key=True, server_default='uuid_generate_v4()')
    phone_number = Column(String)
    data = Column(JSONB)
    created_at = Column(DateTime, server_default='NOW()')
    updated_at = Column(DateTime, server_default='NOW()')

    @property
    def agent_number(self):
        return self.data["agent"]["phoneNumber"]

    def __repr__(self):
        return '<Customer(id={}, phone_number={}, data={}, created_at={}, updated_at={})>'.format(
            self.id,
            self.phone_number,
            self.data,
            self.created_at,
            self.updated_at
        )

【问题讨论】:

  • 我认为正确的 JSON 应该是 {"unsubscribe": true},所以它不是真正的布尔值...您需要转换为字符串,然后作为字符串进行比较。
  • 但是data['unsubscribe'] 会返回一个布尔值true 不是吗?
  • 肯定有办法获取布尔值
  • 这不是一个布尔值,它是一个字符串......你试过把演员排除在外吗?

标签: python casting sqlalchemy


【解决方案1】:

就 PostgreSQL 而言,truejsonb 类型,而不是 SQL boolean 类型。你做不到

SELECT 'true'::jsonb::boolean;

你也做不到

SELECT '123'::jsonb::int;

您需要进行某种转换。一种方法是使用-&gt;&gt; 转换为varchar

SELECT (('{"unsubscribed": true}'::jsonb)->>'unsubscribed')::boolean;

或者,您可以使用jsonb_to_record

SELECT unsubscribed FROM jsonb_to_record('{"unsubscribed": true}'::jsonb) AS o(unsubscribed boolean);

就 SQLAlchemy 而言,您可以这样做

Customer.data['unsubscribed'].astext.cast(sqlalchemy.Boolean).is_(True)

或者,走另一条路

Customer.data['unsubscribed'] == cast('true', JSONB)

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2023-03-09
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多