Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 reload table with text field from sybase ASE to Postgree  [new]
_Drive_
Member

Откуда: Москва
Сообщений: 174
Всем доброго дня...

Столкнулся с проблемой перзагрузки данных с SybaseASE на PostgreSQL
С обычными таблицами вроде разобрался, пришлось для некоторых таблиц делать VIEW
которые и выгружал через BCP, в которых datetime переделывать на convert(varchar(24),datetime_field,23)
и в строковых полях заменять спецсимволы на пробел и просто убирать ...
str_replace(str_replace(str_replace(COMPOUND,char(0xd),''),char(0xa),''),char(0x9),'') as COMPOUND

А вот с полями типа TEXT это не прокатывает ... можно их конечно convert(varchar(16384),...) но
увы есть данные размером побольше (у нас там лежат всякие HTML тексты в которых встречаются
и перевод строки и табуляции).

Когда я переливал данные между Sybase или MSSQL то там можно задать спец. row_termintator
типа вот так
set BCP=C:\Sybase\OCS-15_0\bin\bcp64.exe
set BCPPARAM=-S%SRV% -U%UID% -P%PSW% -A 8192 -c -t \x01 -r \x02 -Jcp1251
%BCP% %DBN%..%1 out %OUTDIR%\%1.txt %BCPPARAM%

а в PostgreSQL оказалось НЕТ такого понятия как row terminator (или row delimiter) :-(((

Как быть?
Неужели придется писать для ЭТОГО очередную "приблуду" ?
Неужели нельзя все это сделать с помощью PSQL ?

PS: Данные я конечно перелил ... с помощью PowerBuilder - PipeLine ... но хотелось как то "изящней"
21 фев 21, 14:32    [22284403]     Ответить | Цитировать Сообщить модератору
 Re: reload table with text field from sybase ASE to Postgree  [new]
Maxim Boguk
Member

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

Поскольку вы не написали как именно вы в postgresql данные загружаете
и какую проблему/ошибку от базы получаете
то помочь вам вряд ли кто то сможет...

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
22 фев 21, 00:02    [22284600]     Ответить | Цитировать Сообщить модератору
 Re: reload table with text field from sybase ASE to Postgree  [new]
vyegorov
Member

Откуда: Баньоло-ин-Пьяно
Сообщений: 1227
_Drive_,

Ни разу не понятно о каком терминаторе вы говорите и почему он так важен?

PostgreSQL умеет работать с данными в разных кодировках, бинарными, CSV и прочими форматами.
По моему опыту, работать с ним удобнее, чем с Oracle или MS SQL.

Можно тут что-то найти для ваших целей: https://www.postgresql.org/download/products/1-administrationdevelopment-tools/
Также вы можете подцепить ваши таблицы из Sybase напрямую в Postgres-е через https://github.com/tds-fdw/tds_fdw
22 фев 21, 01:25    [22284617]     Ответить | Цитировать Сообщить модератору
 Re: reload table with text field from sybase ASE to Postgree  [new]
_Drive_
Member

Откуда: Москва
Сообщений: 174
Всем доброго дня ..

сорри забыл указать способ загрузки в Postgre
вот BAT файл-
set ISQL="С:\PostgreSQL\10\bin\psql.exe"
%ISQL% -h 192.168.1.159 -p 5432 -U user -d myDB_dev -f %1.sql

и сам SQL файл-

truncate table medicine;
\copy medicine from g:\\unload\\data\\medicine.txt with (delimiter E'\x1', encoding 'UTF8', NULL '');

его как параметр передаю в тот BAT файл
22 фев 21, 07:34    [22284625]     Ответить | Цитировать Сообщить модератору
 Re: reload table with text field from sybase ASE to Postgree  [new]
_Drive_
Member

Откуда: Москва
Сообщений: 174
Всем доброго дня

Ура получилось!!!

Но пришлось выгружать ЭТУ таблицу не с SybaseASE 15.7 а с SybaseSQLAnywhere 12
у нас на обоих серверах есть жта таблица
И способ выгрузки с SQLAnywhere другой

вот BAT файл-

set ENG=pinets_cons
set HOST=192.168.1.88
set PORT=3638

set UID=
set PSW=
set ISQL="C:\SQL Anywhere 12\Bin64\dbisql.exe"

%ISQL% -c "ENG=%ENG%;Commlinks=tcpip(host=%HOST%);UID=%UID%;PWD=%PSW%" -d1 -nogui %1.sql -onerror continue

а вот SQL файл-
set temporary option allow_write_client_file=On;
unload table medicine into client file 'g:\unload\data\medicine.txt' format bcp delimited by '\x09' quote '' byte order mark OFF ENCODING 'UTF-8';

В результате в выходном файле в полях (LONG VARCHAR) все спец. символы были заменены на \x0a \x0d \x09 и т.д.
а вот разделитель полей НОРМАЛЬНАЯ табуляция и разделитель строк - перевод строки

Загрузка на PostgreSQL как и раньше через PSQL
вот так ..
truncate table medicine;
\copy medicine from g:\\unload\\data\\medicine.txt with (format text, delimiter E'\t', encoding 'UTF8', NULL '');

PS: а для ASE я так ничего и не придумал...
PS: еще нюанс - командой UNLOAD TABLE можно выгрузить только TABLE а вот VIEW нельзя...
22 фев 21, 10:42    [22284643]     Ответить | Цитировать Сообщить модератору
 Re: reload table with text field from sybase ASE to Postgree  [new]
_Drive_
Member

Откуда: Москва
Сообщений: 174
Еще раз доброго дня ..

чтобы было понятней что за данные можно зайт на наш сайт
https://aptekamos.ru/tovary/lekarstva/bovgialuronidaza-azoksimer-9104/longidaza-liofilizat-dlya-inekciyo-3000me-34449/instrukciya
22 фев 21, 10:46    [22284645]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить