2017-07-06 5 views
0

私は次の値を持っています。私はモデルから引き出してブール値にキャストしようとしています。しかし、私がプログラムを実行すると、 `` jsonbの型をbooleanにキャストできません。ここの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']'は真の真偽を返しますか? – Rafa

+0

ブール値を取得するにはちょうど数えなければなりません – Rafa

答えて

1

ある限りPostgreSQLは懸念しているとして、truejsonbタイプではなく、SQL booleanタイプです。あなたはまた、あなたは変換のいくつかの並べ替えを行う必要があります

SELECT '123'::jsonb::int; 

を行うことはできません

SELECT 'true'::jsonb::boolean; 

を行うことはできません。

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

それとも、あなたがjsonb_to_recordを使用することができます:一つの方法は->>を使用してvarcharに変換することです

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) 
関連する問題