2017-07-06 49 views
0

我從模型中拉出以下值,並嘗試將其轉換爲布爾值。但是,當我運行該程序時,我得到一個錯誤,指出不能將jsonb類型轉換爲布爾值。這裏的jsonb值的值是一個布爾值,爲什麼它不能投射它?我需要改變什麼?Sql Alchemy不能將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 
     ) 
+1

我認爲適當的JSON會有'{「unsubscribe」:true}',所以它不是一個真正的布爾值......你需要將其轉換爲字符串,並將其作爲字符串進行比較。 –

+0

但是'data ['unsubscribe']'會返回一個布爾值'true'不是嗎? – Rafa

+0

當然必須有一些方法來獲得布爾值 – Rafa

回答

1

至於是PostgreSQL而言,truejsonb類型,而不是一個SQL boolean類型。你不能這樣做

SELECT 'true'::jsonb::boolean; 

你也不能這樣做

SELECT '123'::jsonb::int; 

你需要做一些轉換。一種方法是使用->>轉換爲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)