Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 copy: ошибка разбора в конце строки  [new]
per
Member

Откуда:
Сообщений: 134
Доброе утро.

Есть проблема.

Не могу выгрузить значение json через \copy в psql.


psql -U postgres -d prom -h 192.18.12.10 -t -q -c "\COPY (SELECT number "код",replace((extended_info#>'{owner,Name}')::text,'"','')  "Имя" FROM table) TO D:\dump\test.csv  WITH (FORMAT CSV, HEADER, DELIMITER E'\t');"



Первый столбец без второго выгружается нормально.

Подозреваю что не нравится символ # или {}.

Экранирование через \ не помогает.


Подскажите, как сделать чтобы команда корректно отработала?
3 июн 21, 13:54    [22330909]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1312
с кавычками разберитесь. Вы обернули аргумент -c в кавычки - хорошо. Но теперь посмотрите как это будет разбирать shell из-за того что вы никак не модифицировали текст этого аргумента
3 июн 21, 14:02    [22330915]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
per
Member

Откуда:
Сообщений: 134
Melkij
с кавычками разберитесь. Вы обернули аргумент -c в кавычки - хорошо. Но теперь посмотрите как это будет разбирать shell из-за того что вы никак не модифицировали текст этого аргумента



С кавычками как раз все работает нормально, на удивление. (((
3 июн 21, 14:15    [22330920]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
[quot per#22330909]Доброе утро.

Есть проблема.

Не могу выгрузить значение json через \copy в psql.


psql -U postgres -d prom -h 192.18.12.10 -t -q -c "\COPY (SELECT number "код",replace((extended_info#>'{owner,Name}')::text,'"','')  "Имя" FROM table) TO D:\dump\test.csv  WITH (FORMAT CSV, HEADER, DELIMITER E'\t');"


Здесь есть подвох.
1) PostgreSQL позволяет работать с русскими буквами без двойной кавычки = "
Поэтому number "код" - вообще что то странное - это два столбца или же это столбец = "код" который имеет тип = number ? (в пострег такого типа нет)
2) столбец "Имя" - Имя у вас в столбце с большой буквы? или с маленькой? (в таблице имеется ввиду). Если в табл имя столбца = имя, то в запросе просто пишите = имя
3) у вас Windows или Linux
4) по поводу \COPY - гложат сомнения, т.к. дана команда = -с, что означает выполнить команду, а COPY в Постгрес работает без косой черты
COPY
COPY — копировать данные между файлом и таблицей
Синтаксис
COPY имя_таблицы [ ( имя_столбца [, ...] ) ]
 FROM { 'имя_файла' | PROGRAM 'команда' | STDIN }
 [ [ WITH ] ( параметр [, ...] ) ]
 [ WHERE условие ]
COPY { имя_таблицы [ ( имя_столбца [, ...] ) ] | ( запрос ) }
 TO { 'имя_файла' | PROGRAM 'команда' | STDOUT }
 [ [ WITH ] ( параметр [, ...] ) ]


я бы записал код так
psql -U postgres -d prom -h 192.18.12.10 -t -q -c "COPY (SELECT number, код, replace('(extended_info#>)',{owner,Name}')::text,'"','') имя FROM table) TO D:\dump\test.csv WITH (FORMAT CSV, HEADER, DELIMITER e';');"
-t - q не помню, но верю вам на слово.

где
replace ( string text, from text, to text ) = в итоге =  text
Заменяет все вхождения в string подстроки from подстрокой to.
replace('abcdefabcdef', 'cd', 'XX') = abXXefabXXef


(extended_info#>'{owner,Name}' = вообще странный кусок кода не хватает кавычек или у вас extended_info#> это переменная тогда откуда она взялась?

в общем в это коде три ошибки
1) replace('(extended_info#>)',{owner,Name}')::text,'"','')
2) \COPY
3) HEADER
Указывает, что файл содержит строку заголовка с именами столбцов. При выводе первая
строка файла будет содержать имена столбцов таблицы, а при вводе первая строка просто
игнорируется. Этот параметр допускается только для формата CSV.

.
Поэтому кусок кода про замену чего то на текстовой массив вообще не понял.
.

Сообщение было отредактировано: 3 июн 21, 15:14
3 июн 21, 15:20    [22330958]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
О-О-О,

что то вы бред написали...
COPY это серверная комманда и выполняется на сервере
а \COPY это psql комманда и выполяется на КЛИЕНТЕ.
Соответветсвенно если клиент и сервер на разных серверах то результаты будут ОЧЕНЬ РАЗНЫЕ.

"Поэтому number "код" - вообще что то странное - это два столбца или же это столбец = "код" который имеет тип = number ? (в пострег такого типа нет)"
это значение ПОЛЯ number в колонке с названием "код" так что никакой тут проблемы с этим нет хотя я бы для понятности AS "код" бы писал.

"Имя" название колонки в выводе (AS "Имя").

Притензия к extended_info#>'{owner,Name}' тоже не понятна... extended_info - поле в таблице к которому применяется оператор
#>
(
jsonb #> text[] → jsonb
Extracts JSON sub-object at the specified path, where path elements can be either field keys or array indexes.
'{"a": {"b": ["foo","bar"]}}'::json #> '{a,b,1}' → "bar"
)

Вообще вы слишком часто тут ересь полную пишете, рекомендую изучить матчасть сначала.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
3 июн 21, 15:32    [22330965]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Maxim Boguk,

Я уверен в своей правоте и вот пример работы кода:
это локальный запрос

К сообщению приложен файл. Размер - 145Kb
3 июн 21, 16:14    [22330992]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Maxim Boguk,

А вот это запрос через сеть
Специально добавил столбец

К сообщению приложен файл. Размер - 137Kb
3 июн 21, 16:15    [22330995]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 338
Maxim Boguk,

И кусок кода
replace((extended_info#>'{owner,Name}')::text,'"',''
мне непонятен
я не понимаю что хочет сделать код в этой записи

в инструкции четко сказано" replace - это замена текста "
объединение json массивов, или объединение массивов в текстовую запись - это другие функции.


Вот я вижу так ;-)
3 июн 21, 16:21    [22330998]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
О-О-О
Maxim Boguk,

А вот это запрос через сеть
Специально добавил столбец


Вы всеравно с одной физической машины делаете... причем тут сеть то?
Где по вашему образуется файл после команды COPY если база на одном сервере а psql запускается на другом?

автор
И кусок кода
replace((extended_info#>'{owner,Name}')::text,'"',''
мне непонятен
я не понимаю что хочет сделать код в этой записи

в инструкции четко сказано" replace - это замена текста "
объединение json массивов, или объединение массивов в текстовую запись - это другие функции.


и так идем в поле extended_info из него по пути ->owner->Name достаем значение из поля в виде jsonb что то вида "Иван Иваныч"
превращаем этот "Иван Иваныч" jsonb в тип текст (кавычки при этом остаются)
и через replace '"', '' эти кавычки убираем...
что тут блин непонятного???

PS: пи.... понабрали по обьявлениям.
3 июн 21, 19:31    [22331078]     Ответить | Цитировать Сообщить модератору
 Re: copy: ошибка разбора в конце строки  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
per,

Изучить програмированние на shell и правила escape там.
Если бы у вас был линукс я бы сказал что вам было надо что то вида
"\COPY (SELECT number \"код\",replace((extended_info#>'{owner,Name}')::text,'\"','')  \"Имя\" FROM table) TO D:\dump\test.csv  WITH (FORMAT CSV, HEADER, DELIMITER E'\t');"
Но у вас Windows и этот рецепт может не сработать (и я его даже проверить не могу так как нету Windows под рукой).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
4 июн 21, 09:14    [22331196]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить