Sql Alchemy无法将jsonb强制转换为boolean

Raf*_*afa 3 python casting sqlalchemy

我有以下值,我从模型中拉出来,并尝试强制转换为布尔值.但是,当我运行程序时,我得到一个错误,指出`不能将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
        )
Run Code Online (Sandbox Code Playgroud)

uni*_*rio 9

就PostgreSQL而言,它true是一种jsonb类型,而不是SQL boolean类型.你做不到

SELECT 'true'::jsonb::boolean;
Run Code Online (Sandbox Code Playgroud)

你也做不到

SELECT '123'::jsonb::int;
Run Code Online (Sandbox Code Playgroud)

你需要进行某种转换.一种方法是转换为varchar使用->>:

SELECT (('{"unsubscribed": true}'::jsonb)->>'unsubscribed')::boolean;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用jsonb_to_record:

SELECT unsubscribed FROM jsonb_to_record('{"unsubscribed": true}'::jsonb) AS o(unsubscribed boolean);
Run Code Online (Sandbox Code Playgroud)

就SQLAlchemy而言,你可以做到

Customer.data['unsubscribed'].astext.cast(sqlalchemy.Boolean).is_(True)
Run Code Online (Sandbox Code Playgroud)

或者,走另一条路

Customer.data['unsubscribed'] == cast('true', JSONB)
Run Code Online (Sandbox Code Playgroud)