powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / copy: ошибка разбора в конце строки
10 сообщений из 10, страница 1 из 1
copy: ошибка разбора в конце строки
    #40075414
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро.

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

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


Код: sql
1.
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');"




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

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

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


Подскажите, как сделать чтобы команда корректно отработала?
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075416
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с кавычками разберитесь. Вы обернули аргумент -c в кавычки - хорошо. Но теперь посмотрите как это будет разбирать shell из-за того что вы никак не модифицировали текст этого аргумента
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075417
per
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij
с кавычками разберитесь. Вы обернули аргумент -c в кавычки - хорошо. Но теперь посмотрите как это будет разбирать shell из-за того что вы никак не модифицировали текст этого аргумента



С кавычками как раз все работает нормально, на удивление. (((
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075437
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot per#22330909]Доброе утро.

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

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


Код: sql
1.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 не помню, но верю вам на слово.

где
Код: sql
1.
2.
3.
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
Код: sql
1.
2.
3.
Указывает, что файл содержит строку заголовка с именами столбцов. При выводе первая
строка файла будет содержать имена столбцов таблицы, а при вводе первая строка просто
игнорируется. Этот параметр допускается только для формата CSV.


.
Поэтому кусок кода про замену чего то на текстовой массив вообще не понял.
.
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075441
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

что то вы бред написали...
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
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075452
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Я уверен в своей правоте и вот пример работы кода:
это локальный запрос
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075454
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

А вот это запрос через сеть
Специально добавил столбец
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075455
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

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

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


Вот я вижу так ;-)
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075492
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О
Maxim Boguk,

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


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

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

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

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

PS: пи.... понабрали по обьявлениям.
...
Рейтинг: 0 / 0
copy: ошибка разбора в конце строки
    #40075573
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
per,

Изучить програмированние на shell и правила escape там.
Если бы у вас был линукс я бы сказал что вам было надо что то вида
Код: plaintext
"\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
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / copy: ошибка разбора в конце строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]