Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изучаю libpq c . Чтобы не плодить темы, создал эту. / 25 сообщений из 56, страница 1 из 3
14.01.2022, 17:52
    #40126703
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Добрый день, коллеги.

Изучаю libpq c

В этом я полнейший чайник :(

Но есть желание.

В теме будут вопросы, иногда совсем простые.




Очень надеюсь на помощь Maxim Boguk, mefman и других светлых умов форума.
...
Рейтинг: 0 / 0
14.01.2022, 18:00
    #40126706
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Вопрос №1



Как вывести результат PQresultStatus(res) на экран?



Так выводит не статус, а :


Код: sql
1.
        fprintf(stderr,"PQresultStatus: %s", PQresultStatus(res));



Segmentation fault



Кусок текста полностью, на котором останавливается:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    res = PQexec(conn, "SELECT version();");


        fprintf(stderr,"PQresultStatus: %s", PQresultStatus(res));

    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "PQexec command failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }



Я подозреваю что тут вместо PGRES_COMMAND_OK выдает PGRES_TUPLES_OK


Но хочется вывести что он выводит, подозреваю какое-то преобразование требуется.
...
Рейтинг: 0 / 0
14.01.2022, 18:17
    #40126710
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
PGRES_COMMAND_OK выдает PGRES_TUPLES_OK

так и было, но как вывести на экран текущую PQresultStatus так не разобрался пока.
...
Рейтинг: 0 / 0
14.01.2022, 19:24
    #40126721
grgdvo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Уткъ,

Код: plaintext
1.
printf("...%s\n", PQresStatus(PQresultStatus(res)));
...
Рейтинг: 0 / 0
14.01.2022, 20:00
    #40126729
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
grgdvo
Уткъ,

Код: plaintext
1.
printf("...%s\n", PQresStatus(PQresultStatus(res)));




Большое спасибо!

Код: sql
1.
...PGRES_TUPLES_OK



Почитаю про разницу между printf и fprintf.





Вопрос №1 снят.
...
Рейтинг: 0 / 0
16.01.2022, 03:58
    #40126988
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Вопрос №2


Как взять один столбец таблицы на одном сервере и вставить эти данные в новую таблицу на другом?


Я так понимаю что требуется PQputCopyData.

Но как в нее вставить результат запроса с другого сервера?
...
Рейтинг: 0 / 0
16.01.2022, 10:36
    #40127001
grgdvo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Уткъ,

Советую сначала представить задачу на SQL уровне, что вы хотите, а потому уже переложить на libpq.
PG не колоночная СУБД, и просто так взять одну колонку и куда-то там ее вставить не получится.
И PQputCopyData здесь точно не поможет (эта функция реализует SQL-команду COPY).
...
Рейтинг: 0 / 0
16.01.2022, 12:47
    #40127008
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
grgdvo
Уткъ,

Советую сначала представить задачу на SQL уровне, что вы хотите, а потому уже переложить на libpq.
PG не колоночная СУБД, и просто так взять одну колонку и куда-то там ее вставить не получится.
И PQputCopyData здесь точно не поможет (эта функция реализует SQL-команду COPY).



Да, я давно все представил требуется:

Код: sql
1.
2.
INSERT INTO table
SELECT field1 FROM dblink



Как это сделать?

Я думал на PQputCopyData результат запроса как-то подавать.
...
Рейтинг: 0 / 0
16.01.2022, 12:48
    #40127010
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
сразу говорю что сам длинк не подходит.
...
Рейтинг: 0 / 0
16.01.2022, 14:38
    #40127028
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Получаешь данные с одного сервера запросом SELECT, потом вставляешь их в другой запросом INSERT.
...
Рейтинг: 0 / 0
16.01.2022, 17:27
    #40127044
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Dimitry Sibiryakov
Получаешь данные с одного сервера запросом SELECT, потом вставляешь их в другой запросом INSERT.


Зачем писать свой FDW если нет каких то КРАЙНЕ специфических требований - я не знаю.

PS: FDW который множественные вставки через insert делает - для batch переносов пригоден крайне плохо потому что упирается не в скорость серверов и даже не в ширину канала а в network latency которая почти никак не поддаётся снижению обычно.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
16.01.2022, 18:49
    #40127057
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Maxim Boguk
Dimitry Sibiryakov
Получаешь данные с одного сервера запросом SELECT, потом вставляешь их в другой запросом INSERT.


Зачем писать свой FDW если нет каких то КРАЙНЕ специфических требований - я не знаю.

PS: FDW который множественные вставки через insert делает - для batch переносов пригоден крайне плохо потому что упирается не в скорость серверов и даже не в ширину канала а в network latency которая почти никак не поддаётся снижению обычно.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


да, инсерт тут не в тему как-то.

copy (PQputCopyData) подходит больше в теории


но как это сделать?

я так понял что как-то надо на вход подать PQputCopyData результат SELECT с другого сервера.


но примеров таких не нашел еще...
...
Рейтинг: 0 / 0
16.01.2022, 19:47
    #40127073
grgdvo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Уткъ,

Надо определится, что конкретно Вы хотите.
Вопрос №2 звучал как, хочу взять колонку таблицы с одного сервера и вставить ее в таблицу другого.
Покажите источники данных... на пальцах, скринами... как-нибудь покажите.

(Ответ при прямом прочтении вопроса - колонку данных вставить нельзя, можно вставить(изменить/удалить) список записей, состоящих из полей и как бы образующих колонки).
...
Рейтинг: 0 / 0
16.01.2022, 20:36
    #40127078
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
grgdvo
Уткъ,

Надо определится, что конкретно Вы хотите.
Вопрос №2 звучал как, хочу взять колонку таблицы с одного сервера и вставить ее в таблицу другого.
Покажите источники данных... на пальцах, скринами... как-нибудь покажите.

(Ответ при прямом прочтении вопроса - колонку данных вставить нельзя, можно вставить(изменить/удалить) список записей, состоящих из полей и как бы образующих колонки).


яж писал:

Код: sql
1.
2.
INSERT INTO table
SELECT field1 FROM dblink




поясняю:

взять результат SELECT field1 FROM table1 на одном сервере и вставить его в таблицу на другом сервере.

вроде понятно цель описал.

Как это сделать?
...
Рейтинг: 0 / 0
16.01.2022, 20:52
    #40127082
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
grgdvo,

вот картинка
...
Рейтинг: 0 / 0
16.01.2022, 22:45
    #40127101
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Ну или как-то PQgetCopyData с одного сервера в PQputCopyData перенаправить?
...
Рейтинг: 0 / 0
17.01.2022, 00:01
    #40127108
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Уткъ,
По-моему, Вы занимаетесь ерундой.
...
Рейтинг: 0 / 0
17.01.2022, 01:15
    #40127112
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
mefman
Уткъ,
По-моему, Вы занимаетесь ерундой.


Возможно, однако надо сделать это.

Вы можете подсказать как?
...
Рейтинг: 0 / 0
17.01.2022, 10:53
    #40127154
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Уткъ
grgdvo,

вот картинка

Код: plaintext
psql -h host1 -c 'copy tablename(columnname) to stdout' | psql -h host2 -c 'copy tablename from stdin'
всё
...
Рейтинг: 0 / 0
17.01.2022, 10:55
    #40127156
Misha111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Уткъ,

через дблинк обычным инсертом
...
Рейтинг: 0 / 0
17.01.2022, 15:05
    #40127212
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Maxim Boguk
FDW который множественные вставки через insert делает - для batch переносов пригоден крайне плохо потому что упирается не в скорость серверов и даже не в ширину канала а в network latency которая почти никак не поддаётся снижению обычно.

Снижению да, но поддаётся маскированию за счёт буферизации fetch на одной стороне и Array DML/Bulk Insert/etc на другой в результате чего по сети идёт поток данных без ожидания ответа на каждую запись.

PS: Чем, собственно, и занимаются PQgetCopyData/PQputCopyData если документация не врёт.
...
Рейтинг: 0 / 0
18.01.2022, 22:41
    #40127609
grgdvo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Уткъ
mefman
Уткъ,
По-моему, Вы занимаетесь ерундой.


Возможно, однако надо сделать это.

Вы можете подсказать как?


Если делать в лоб без dblink и прочих плюшек, то примерно как-то так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
/* select ... from ... -- db1 */
PGconn* from_db = PQconnectdb("host=db1 ...");
PGresult* from_data = PQexec(from_db, "SELECT from_mycolumn FROM from_mytable");

/* for_insert - это строка текста, которую прибавим к запросу 
INSERT INTO to_mytable VALUES <здесь список значений в скобках> (xxx), (yyy) ...
*/
char* to_insert_values = 0;

for (i; i < PQntuples(from_data); i++)
{
  char* from_column_val = PQgetvalue(from_data, i, 0);
  /* здесь надо копировать from_column_val в отдельную строку для последующего INSERT; выделять промеж. память под эти значения */
  ... strcat(to_insert_values, from_column_val);
}
/* Вычерпали все записи, скопировали значения, можно закрыть соединение from */
PQclear(from_data);
PQfinish(from_db);

char* to_query = 0;
malloc(??? посчитать сколько примерно надо памяти для строки INSERT запроса);

strcat(to_query, to_insert_values);
/* Здесь в to_query должны получить строку вида "INSERT INTO to_mytable (to_mycolumn) VALUES (xyz), (abc), ...
где последняя часть сгенерирована в цикле при получении значений с db1 */

PGconn* to_db = PQconnectdb("host=db2 ...");
PGresult* to_data = PQexec(to_db, to_query);
PQclear(to_data);
PQfinish(to_db);

return 0;
...
Рейтинг: 0 / 0
19.01.2022, 10:30
    #40127686
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
grgdvo,

а зачем так сложно? Открыли два коннекта, в одном сделали copy from в другом copy to и просто перекладываете построчно всё из первого во второй без всяких извращений вокруг форматирования insert'ов.
Это если уж очень хочется на C делать.
...
Рейтинг: 0 / 0
19.01.2022, 21:34
    #40127943
grgdvo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Melkij,

авторЕсли делать в лоб без dblink и прочих плюшек, то примерно как-то так
Это пусть уж ТС решает, как ему проще или сложнее.
Захочет - спросит.
Предела совершенства нет.
...
Рейтинг: 0 / 0
02.02.2022, 01:52
    #40131136
Уткъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изучаю libpq c . Чтобы не плодить темы, создал эту.
Вопрос №2 Решен.

В итоге получилось на основе примера от grgdvo :

grgdvo
Уткъ
пропущено...


Возможно, однако надо сделать это.

Вы можете подсказать как?


Если делать в лоб без dblink и прочих плюшек, то примерно как-то так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
/* select ... from ... -- db1 */
PGconn* from_db = PQconnectdb("host=db1 ...");
PGresult* from_data = PQexec(from_db, "SELECT from_mycolumn FROM from_mytable");

/* for_insert - это строка текста, которую прибавим к запросу 
INSERT INTO to_mytable VALUES <здесь список значений в скобках> (xxx), (yyy) ...
*/
char* to_insert_values = 0;

for (i; i < PQntuples(from_data); i++)
{
  char* from_column_val = PQgetvalue(from_data, i, 0);
  /* здесь надо копировать from_column_val в отдельную строку для последующего INSERT; выделять промеж. память под эти значения */
  ... strcat(to_insert_values, from_column_val);
}
/* Вычерпали все записи, скопировали значения, можно закрыть соединение from */
PQclear(from_data);
PQfinish(from_db);

char* to_query = 0;
malloc(??? посчитать сколько примерно надо памяти для строки INSERT запроса);

strcat(to_query, to_insert_values);
/* Здесь в to_query должны получить строку вида "INSERT INTO to_mytable (to_mycolumn) VALUES (xyz), (abc), ...
где последняя часть сгенерирована в цикле при получении значений с db1 */

PGconn* to_db = PQconnectdb("host=db2 ...");
PGresult* to_data = PQexec(to_db, to_query);
PQclear(to_data);
PQfinish(to_db);

return 0;




Но с учетом сообщения от Melkij

Melkij
Открыли два коннекта, в одном сделали copy from в другом copy to и просто перекладываете построчно всё из первого во второй без всяких извращений вокруг форматирования insert'ов.
Это если уж очень хочется на C делать.




Большое спасибо, парни!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изучаю libpq c . Чтобы не плодить темы, создал эту. / 25 сообщений из 56, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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