Postgresql SQLalchemy filtre sorgusu jsonb dizeleri listesi için

Aug 18 2020

Lütfen beni affedin çünkü SQLalchemy'de yeniyim ve hala Postgresql ile yeni başlayan biriyim.

Aşağıdaki gibi bir gin indeksli jsonb string sütunum var:

my_id| my_column
0    | "AAAA"
1    | "BBBB"
2    | "CCCC"

Sadece bu dizeyi aldığım için 'my_column'da' AAAA 've' CCCC 'aramam gerekiyor. Bu dizelerden yüzlerce olduğu için bu, tercihan bir döngü olmadan yapılmalıdır. "sütunum", "tablom" tablosuna aittir. 'My_id' sütunu birincil anahtardır. Yalnızca 'AAAA' için açık sql sorgusu şöyle olacaktır:

select * from my_table
where my_column ? 'AAAA'

SQLalchemy kullanıldığında, bunun sorgusu python'da şöyle olacaktır:

from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.dialects.postgresql import JSONB

Base = declarative_base()

class my_class(Base):
__tablename__ = 'my_table'
my_id     =  Column(Integer, primary_key=True)
my_column =  Column(JSONB)

engine = create_engine('postgresql+psycopg2://user:pass@host/db')
session = sessionmaker(bind=engine)()

session.query(my_class).filter(my_class.my_column.has_key("AAAA").all()

Aşağıdaki gibi in cümlesini kullanarak bir tamsayı listesi sorgulamanın mümkün olduğunu biliyorum:

session.query(my_class).filter(my_class.example_id.in_((123,456))).all()

Ama böyle kullanarak başarılı olamadım:

session.query(my_class).filter(my_class.my_column.in_(('AAAA','CCCC'))).all()

Bir döngüye başvurmadan bir jsonb sütunundaki dizelerin listesini sorgulamanın bir yolu var mı? Aramak istediğim tüm dizeleri açıkça yazmadan, tüm dizeleri içeren liste benzeri bir parametre girmek mümkün mü:

session.query(my_class).filter(my_class.my_column.in_(([list_full_of strings]))).all()

DÜZENLE:

Sorgudan:

session.query(my_class).filter(my_class.my_column.in_(('AAAA','CCCC'))).all()

Aşağıdaki hata ortaya çıkar:

sqlalchemy.exc.DataError: (psycopg2.errors.InvalidTextRepresentation) invalid input syntax for type json
LINE 3: WHERE my_table.my_column IN ('AAAA', 'CCCC')
                                        ^
DETAIL:  Token "AAAA" is invalid.
CONTEXT:  JSON data, line 1: AAAA...

[SQL: SELECT my_table.my_id AS my_table_my_id, my_table.my_column AS my_table_my_column
FROM my_table
WHERE my_table.my_column IN (%(my_column_1)s, %(my_column_2)s)]
[parameters: {'my_column_1': 'AAAA', 'my_column_2': 'CCCC'}]
(Background on this error at: http://sqlalche.me/e/13/9h9h)

Yanıtlar

1 snakecharmerb Aug 18 2020 at 20:28

Aşağıdaki gibi gerekli has_keyifadeleri bir içinde oluşturabilirsiniz or_:

keys = ['AAAA', 'CCCC'] 
clauses = [my_class.my_column.has_key(k) for k in keys]  
recs = session.query(my_class).filter(sqlalchemy.or_(*clauses)).all()  
print([r.my_column for r in recs])

Çıktı:

['AAAA', 'CCCC']