#postgresql #replication #pglogical
Вопрос:
Я пытаюсь скопировать таблицу, содержащую столбец jsonB. Я хочу использовать фильтрацию строк для выбора только тех строк, которые мне нужны. Как определить фильтр строк для jsonB?
Человек за столом:
id serial,
name TEXT NOT NULL,
details JSONB NOT NULL,
modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (name));
Примеры данных:
id | name | details | modified_at
---- --------- ----------------- -------------------------------
1 | person1 | {"city": "nyc"} | 2021-05-17 06:05:55.735086 00
2 | person2 | {"city": "SF"} | 2021-05-17 06:06:30.028065 00
Я попробовал следующее, и они не работают:
SELECT pglogical.replication_set_add_table(set_name:= 'replicate1', relation := 'person', row_filter:= details->>'city' = 'nyc');
Другой вариант, который я попробовал:
SELECT pglogical.replication_set_add_table(set_name:= 'replicate1', relation := 'person', row_filter:= "details->>'city' = 'nyc'");
Комментарии:
1. Не связано, но:
:=
для предоставления значений для именованных параметров не рекомендуется=>
использовать оператор, соответствующий стандарту.2. Я бы предположил
row_filter
, что это параметр varchar/text, так что, вероятно, он должен быть:row_filter => 'details->>''city'' = ''nyc'''
3. @a_horse_with_no_name Спасибо, не знал, что это устарело.
Ответ №1:
Решение можно найти здесь: https://github.com/2ndQuadrant/pglogical/issues/332