2017-07-06 4 views
0

Ich habe den folgenden Wert Ich ziehe von einem Modell, und versuchen, zu einem Boolean zu werfen. Wenn ich das Programm ausführe, bekomme ich einen Fehler, der besagt, dass 'jsonb type nicht in Boolean umgewandelt werden kann. Der Wert für den Jsonb-Wert ist hier ein Boolescher Wert. Warum kann er also nicht umgewandelt werden? Was muss ich ändern?Sql Alchemy kann Jsonb nicht zu Boolean

Der Datenwert, den ich zu bekommen habe versucht, die boolean aus {"unsubscribe" : "True"}

Hier ist die Linie, die den Fehler verursacht.

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

Hier ist das Modell Kunde ist

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

Ich denke, das richtige JSON wäre '{" unsubscribe ": true}', also ist es nicht wirklich ein boolesches ... Sie müssen stattdessen in eine Zeichenfolge umwandeln und als Zeichenfolge vergleichen. –

+0

aber 'data ['unsubscribe']' 'würde ein boolesches' wahr 'zurückgeben, nicht wahr? – Rafa

+0

sicherlich muss es irgendeinen Weg geben, nur den booleschen Wert zu erhalten – Rafa

Antwort

1

Was PostgreSQL betrifft, so ist die true ein jsonb Typ, kein SQL boolean Typ. Sie können nicht tun

SELECT 'true'::jsonb::boolean; 

Sie können auch nicht tun müssen

SELECT '123'::jsonb::int; 

Sie werden irgendeine Art von Umwandlung zu tun. Eine Möglichkeit ist, varchar mit ->> zu konvertieren:

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

Oder Sie jsonb_to_record verwenden:

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

Soweit SQLAlchemy betrifft, so können Sie das tun

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

Oder gehen Sie in die andere Richtung

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