вставка массива JSON объектов - PullRequest
0 голосов
/ 10 апреля 2020

Я использую хранимую процедуру, принимающую параметр типа JSON []. Предполагая, что список похож на listJson = [{"value":"v1"}, {"value" : "v2"}], я хотел бы вызвать следующий метод psycopg2:

cursor.execute("call my_stored_procedure(%XXX)",(listJson,))

, но я не знаю, как заменить %XXX, чтобы сделать заполнитель совместимым со списком. Я безуспешно пытался %s::json[] и %s::jsonb[]. Если невозможно использовать описанный выше метод, я был бы признателен, если бы кто-нибудь указал мне другую стратегию для выполнения вызова. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Как насчет использования psycopg2.extras.Json:

cursor.execute("CALL my_stored(%s)",(Json(list),))

Кроме того, попробуйте использовать более подходящие имена переменных, такие как values вместо list, потому что это встроенный тип.

0 голосов
/ 10 апреля 2020
import psycopg2, json
...
list = [{"value":"v1"}, {"value" : "v2"}]
listJson = [json.dumps(x) for x in list]
cursor.execute("call my_stored_procedure(%s::json[])",(listJson,))
0 голосов
/ 10 апреля 2020

У вас нет JSON для начала, у вас просто есть список диктов. Это то, что вы хотите иметь в python?

>>> listJson = [{"value":"v1"}, {"value" : "v2"}]
>>> type(listJson)
<type 'list'>
>>> type(listJson[0])
<type 'dict'>
>>> type(listJson[1])
<type 'dict'>

Вы можете составить список строк, каждая из которых содержит действительный синтаксис JSON, и вызывать с этим:

listJson = ['{"value":"v1"}', '{"value" : "v2"}']
cursor.execute("CALL my_stored(%s::json[])",(listJson,))
...