2015-04-30 18 views
11

Bir Postgres veritabanına (9.3) sahip olduğumu ve Resources adlı bir tablo olduğunu varsayalım. Resources tablosunda bir int ve bir JSON türü olan data olan id alanlarına sahibim.Python SQLAlchemy ve Postgres - Bir JSON öğesini sorgulamak için

Diyelim ki, aşağıdaki tablodaki kayıtlarım var.

  • 1, { 'ad': 'Dave, 'soyad': 'Gallant'}
  • 2, { 'ad': ' John', 'soyad': 'Doe'}

:

ne yapmak istiyorum

böyle bir şey yazmaya çalıştı veri sütunu lastname eşit "Doe" ile bir json elemanı sahip olduğu tüm kayıtları dönmek bir sorgu yazmak olduğunu

records = db_session.query(Resource).filter(Resources.data->>'lastname' == "Doe").all() 

Pycharm bana "- >>"

Üzerinde bir derleme hatası veriyor. Filtre gereği ne yazacağımı bilen var mı? JSON'a astext

records = db_session.query(Resource).filter(
       Resources.data["lastname"].astext == "Doe" 
     ).all() 
+0

gibi bunu yapabilir gibi 'astext' kullanmayı deneyin Doe "). All()' ve çalışıp çalışmadığını görün – Anzel

+0

Çalıştığımıza göre, ".c" yi kaldırmam ve doğrudan "Resources.data" yı kullanmam gerekiyordu. Teşekkürler! –

+0

Ah ... evet, genellikle .c' ile sütun adı için gidiyorum ... çözdüğüne sevindim. Ben daha sonra bir cevap olarak göndereceğim :-) – Anzel

cevap

20

deneyin. "==` ... filtre (Resources.c.data [ "soyad"] astext.

from sqlalchemy.dialects.postgres import JSON 
from sqlalchemy.sql.expression import cast 
db_session.query(Resource).filter(
    Resources.data["lastname"] == cast("Doe", JSON) 
).all() 
+2

Büyük cevap. Buna ek olarak, verdiğiniz bağlantı da iç içe json sorgulama hakkında bazı bilgiler sağlar (örneğin, query.filter (Resources.data [("lastname", "diğer-yuvalanmış-json-under-lastname")]. == "Değer Ne olursa") all()) ve veri tiplerini nasıl değiştirilir. –

-1

sqlalchemy.types.JSON göre, bu

from sqlalchemy import JSON 
from sqlalchemy import cast 
records = db_session.query(Resource).filter(Resources.data["lastname"] == cast("Doe", JSON)).all()