Запрос фильтра PostgreSQL SQLALCHEMY для списка строк JSONB -- python поле с участием postgresql поле с участием sqlalchemy пол Связанный проблема

Postgresql SQLalchemy filter query for list of jsonb strings


1
vote

проблема

русский

Пожалуйста, прости меня, как я новичок в SQLALCHEMY и еще новичок с PostgreSQL.

У меня есть джин индексированный jsonb строковый столбец, который похож на ниже:

 <код> my_id| my_column 0    | "AAAA" 1    | "BBBB" 2    | "CCCC"   

Мне нужно искать в «My_Column» для «AAAA» и «CCCC», как я только получаю эту строку. Это должно быть сделано предпочтительным без контура, так как есть сотни этих строк. «My_Column» принадлежит таблицу «My_Table». Столбец «My_id» является основным ключом. Явный запрос SQL только для «AAAA» будет:

 <код> 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()   

Я знаю, что можно запрашивать список целых чисел, используя пункт в том, как ниже:

 <код> 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)   
Английский оригинал

Please forgive me as I am new to SQLalchemy and still a beginner with Postgresql.

I have a gin indexed jsonb string column that is like below:

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

I need to search in 'my_column' for 'AAAA' and 'CCCC' as I only receive this string. This should be done preferable without a for-loop as there are hundreds of these strings. 'my_column' belongs to the table 'my_table'. The column 'my_id' is the primary key. The explicit sql query just for 'AAAA' would be:

select * from my_table where my_column ? 'AAAA' 

Using SQLalchemy, the query for this would be in python something like:

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() 

I know that it is possible to query a list of integers using the in clause like below:

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

But I have not been successful using like so:

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

Is there a way to query a list of strings in a jsonb column without resorting to a loop? Is it possible to just input a list-like parameter containing all the strings without explicitly typing all the strings I want to search like so:

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

EDIT:

From the query:

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

The following error arises:

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) 
</div
        
       
       

Список ответов

1
 
vote
vote
Лучший ответ
 
<Р> Вы можете создать требуемый <код> has_key выражения внутри <код> 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])   

Выход:

 <код> ['AAAA', 'CCCC']   
 

You could create the required has_key expressions inside an or_, like this:

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'] 
</div
 
 

Связанный проблема

0  Как умножить диагональные элементы друг другом, используя numpy?  ( How to multiply diagonal elements by each other using numpy ) 
Для целей этого упражнения давайте рассмотрим матрицу, где элемент <код> m_{i, j} дается правилом <код> m_{i, j} = i*j Если <код> i == j и <код > 0 else. ...

2  Использование OpenPyXL для поиска ячейки в одном столбце, а затем для распечатки строки для этой соответствующей ячейки  ( Using openpyxl to search for a cell in one column and then to print out the row ) 
Например, я хочу иметь возможность вводить в мою программу через пользователь ввода данных, а затем распечатать ряд, относящуюся к этой ячейке. В идеале, если...

1  Cprofile принимает много памяти  ( Cprofile taking a lot of memory ) 
Я пытаюсь профилировать мой проект в Python, но у меня заканчивается память. Сам мой проект довольно памяти, но даже пробеги полумана с возможностью погибан...

2  Создание кафельной карты с блендером  ( Creating a tiled map with blender ) 
Я смотрю на создание плитки карты на основе 3D-модели, сделанной в Blender, карта 16 х 16 в блендере. У меня есть 4 разных уровня зума, и каждая плитка со...

4  Django на Dreamhost с пассажиром: нет ответа на браузеры, без ошибок  ( Django on dreamhost with passenger no response to browsers no error ) 
Я пытаюсь получить некоторое тривиальное Джанго, чтобы бежать на моей учетной записи Dreamhost. Я сделал свою домашнюю работу, прежде чем выбрать Dreamshost, ...

0  Как можно включить против псевдонима в Pyqtgraph ImageView?  ( How can anti aliasing be enabled in a pyqtgraph imageview ) 
Я использую <код> pyqtgraph 's <код> ImageView widget, чтобы отобразить изображение, которое необходимо масштабировать в 1,25 до 1,5, чтобы быть удобным. Эт...

1  Вызов функции Python с параметрами из скрипта оболочки  ( Calling a python function with options from shell script ) 
У меня есть сценарий Python, который принимает различные варианты из командной строки e.g. -Runs с графическим интерфейсом <код> python myscript.py -gui...

32  Sklearn AgGlomerative Clustering Matrix Matrix  ( Sklearn agglomerative clustering linkage matrix ) 
Я пытаюсь нарисовать полную ссылку <Код> scipy.cluster.hierarchy.dendrogram , и я обнаружил, что <Код> scipy.cluster.hierarchy.linkage медленнее, чем <К...

2  По умолчанию пользователя в Django (стоимость Sentinel)  ( Default user in django sentinel value ) 
У меня есть модель: <код> class NotificationSettings(models.Model): android_device = models.ForeignKey( 'users.AndroidDevice', default=N...

33  Argparse «Обязательные» необязательные аргументы  ( Argparse compulsory optional arguments ) 
argparse модуль имеет то, что называются «дополнительными» аргументами. Все аргументы, имя которого начинается с <код> - или <код> -- необязательно по умо...

2  Heroku Установить Letsencrypt - SU: ДОЛЖЕН БУДЬТ  ( Heroku install letsencrypt su must be run from a terminal ) 
Я пытаюсь создать сертификат SSL для Мой сайт , чтобы получить зеленый замок. . Во время передачи, как это сделать (никогда не делал ничего с сертификатами ...

0  Как написать Pivot_Table в TXT файл Python  ( How to write the pivot table to txt file by python ) 
Я получаю pivot_table следующим образом: Есть места в таблице, Что я хочу написать на TXT: Как получить это? <код> WKWebView0 ...

0  Python получает глобальные модули вместо местных внутри виртуальны  ( Python is getting global modules instead of local ones inside of virtualenv ) 
Это мой первый раз, используя virtualenv и mysqldb, и я получаю странную ошибку. После того, как я настрою этот Virtualenv, я установил MySQLDB изнутри Virtua...

52  Как пройти параметры функции при использовании timeit.timer ()  ( How to pass parameters of a function when using timeit timer ) 
Это план простая программа <код> # some pre-defined constants A = 1 B = 2 # function that does something critical def foo(num1, num2): # do something ...

1  Создание метода класса Python с использованием закрытия  ( Creating a python class method using a closure ) 
Я использую модуль unittest unittest module (как я довольно новый python), и я оказываюсь, что вы выполняете те же утверждения испытаний снова и снова. Я х...

Связанный проблема

0  Как умножить диагональные элементы друг другом, используя numpy? 
2  Использование OpenPyXL для поиска ячейки в одном столбце, а затем для распечатки строки для этой соответствующей ячейки 
1  Cprofile принимает много памяти 
2  Создание кафельной карты с блендером 
4  Django на Dreamhost с пассажиром: нет ответа на браузеры, без ошибок 
0  Как можно включить против псевдонима в Pyqtgraph ImageView? 
1  Вызов функции Python с параметрами из скрипта оболочки 
32  Sklearn AgGlomerative Clustering Matrix Matrix 
2  По умолчанию пользователя в Django (стоимость Sentinel) 
33  Argparse «Обязательные» необязательные аргументы 
2  Heroku Установить Letsencrypt - SU: ДОЛЖЕН БУДЬТ 
0  Как написать Pivot_Table в TXT файл Python 
0  Python получает глобальные модули вместо местных внутри виртуальны 
52  Как пройти параметры функции при использовании timeit.timer () 
1  Создание метода класса Python с использованием закрытия