[英]Convert Postgresql query with jsonb_each to sqlalchemy
[英]Postgresql SQLalchemy filter query for list of jsonb strings
請原諒我,因為我是 SQLalchemy 的新手,還是 Postgresql 的初學者。
我有一個 gin 索引的 jsonb 字符串列,如下所示:
my_id| my_column
0 | "AAAA"
1 | "BBBB"
2 | "CCCC"
我需要在“my_column”中搜索“AAAA”和“CCCC”,因為我只收到這個字符串。 這應該在沒有 for 循環的情況下更好地完成,因為有數百個這樣的字符串。 'my_column' 屬於表 'my_table'。 “my_id”列是主鍵。 僅針對“AAAA”的顯式 sql 查詢將是:
select * from my_table
where my_column ? 'AAAA'
使用 SQLalchemy,對此的查詢將在 python 中,類似於:
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()
我知道可以使用 in 子句查詢整數列表,如下所示:
session.query(my_class).filter(my_class.example_id.in_((123,456))).all()
但是我沒有像這樣使用成功:
session.query(my_class).filter(my_class.my_column.in_(('AAAA','CCCC'))).all()
有沒有辦法在不使用循環的情況下查詢 jsonb 列中的字符串列表? 是否可以只輸入一個包含所有字符串的類似列表的參數,而無需像這樣顯式鍵入我要搜索的所有字符串:
session.query(my_class).filter(my_class.my_column.in_(([list_full_of strings]))).all()
編輯:
從查詢:
session.query(my_class).filter(my_class.my_column.in_(('AAAA','CCCC'))).all()
出現以下錯誤:
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)
您可以在or_
has_key
,如下所示:
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])
Output:
['AAAA', 'CCCC']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.