powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изучаю libpq c . Чтобы не плодить темы, создал эту.
55 сообщений из 55, показаны все 3 страниц
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40126703
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги.

Изучаю libpq c

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

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

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




Очень надеюсь на помощь Maxim Boguk, mefman и других светлых умов форума.
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40126706
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос №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
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40126710
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PGRES_COMMAND_OK выдает PGRES_TUPLES_OK

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

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

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




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

Код: sql
1.
...PGRES_TUPLES_OK



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





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


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


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

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

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

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



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

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



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

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


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

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

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


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

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

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


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

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


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

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


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

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

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

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

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


яж писал:

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




поясняю:

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

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

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

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


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

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

вот картинка

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

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

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

PS: Чем, собственно, и занимаются PQgetCopyData/PQputCopyData если документация не врёт.
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40127609
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уткъ
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
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40127686
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grgdvo,

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

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

Вопрос №3

Под линукс все нормально скопилирвалось и работает.


Под виндоус скомпилировалось, но при запуске:

не удалось продолжить выполнение кода поскольку система не обнаружила LIBPQ.dll

При попытке зарегистрировать библиотеку:
Код: sql
1.
regsvr32 "C:\Program Files\PostgreSQL\11\lib\libpq.dll"




Ошибка:
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40132538
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста что сделать чтобы скопилированное приложение пд Win запустилось?
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40132544
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам файл

"C:\Program Files\PostgreSQL\11\lib\libpq.dll"

существует.
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40132564
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мож как-то связано х32 и х64 ?
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40132626
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
мож как-то связано х32 и х64 ?


Не то чтобы вам никто не хочет отвечать но этот вопрос уже совсем оффтопик на этом форуме и просто специалистов нет.
Я последний раз что то под винду 22 года назад собирал.
Вам бы в сишный форум обратиться.

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


Не то чтобы вам никто не хочет отвечать но этот вопрос уже совсем оффтопик на этом форуме и просто специалистов нет.
Я последний раз что то под винду 22 года назад собирал.
Вам бы в сишный форум обратиться.

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


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

Пропишите в системный PATH путь до C:\Program Files\PostgreSQL\11\lib, чтобы система смогла найти и саму DLL и зависимые библиотеки, которые в этой директории могут быть расположены. Раньше вроде установка под Windows стандартной сборки от EDB что-то прописывала, но может сбилось. Честно говоря Windows тоже постольку-поскольку использую и не помню точно. Но причина именно в этом. DLL и зависимые от нее не найдены.

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

Пропишите в системный PATH путь до C:\Program Files\PostgreSQL\11\lib, чтобы система смогла найти и саму DLL и зависимые библиотеки, которые в этой директории могут быть расположены. Раньше вроде установка под Windows стандартной сборки от EDB что-то прописывала, но может сбилось. Честно говоря Windows тоже постольку-поскольку использую и не помню точно. Но причина именно в этом. DLL и зависимые от нее не найдены.

И не используйте regsvr32. Это вообще про другое и в данном случае никакая регистрация тут не поможет. libpq не поддерживает интерфейса регистрации, который ожидает regsvr32.


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

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

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

Под windows не работает PQgetvalue.


Вот простой код:

Код: 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.
33.
34.
35.
36.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <libpq-fe.h>

//#include <windows.h> //только для windows


int main()
{
	char* conninfo = "dbname=postgres user=postgres host=127.0.0.1 password=postgres";  //тут укажите любой свой сервер	
	PGconn*    conn;
	PGresult*  res;

printf("Connecting\n");
    conn = PQconnectdb(conninfo);
    if (PQstatus(conn) != CONNECTION_OK)
    {
        printf("Connection to database failed");
		exit(1);
    }

printf("SQL Executing\n");	
	res=PQexec(conn,"SELECT 'test_resoult OK';"); 

printf("Trying to take resoult\n");
	
	printf("%s\n", PQgetvalue(res, 0, 0));

printf("Closing connection\n");
	PQclear(res);
	PQfinish(conn);

    return 0;
}






Под Linux он компилируется и отрабатывает нормально, вот такой результат:

Connecting
SQL Executing
Trying to take resoult
test_resoult OK
Closing connection



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

Код: plaintext
1.
PQgetvalue(res, 0, 0)



запрашиваю напрямую, без переменных для упрощения, с переменными так же под Linux работает, под win нет.


Пробовал уже разные варианты:

Код: plaintext
1.
2.
3.
PQgetvalue(res, 0, 1)
PQgetvalue(res, 1, 1)
PQgetvalue(res, 1, 0)



результат тот же.

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

Код: plaintext
1.
2.
3.
	printf("PQntuples = %d\n", PQntuples(res));
	printf("PQnfields = %d\n", PQnfields(res));
	//printf("%s\n", PQgetvalue(res, 0, 0));




То и под линуксом и под виндоус одинаково выводится:

Код: sql
1.
2.
PQntuples = 1
PQnfields = 1




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

сраный касперский
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40132817
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
mefman
Уткъ,
По-моему, Вы занимаетесь ерундой.


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

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

Если таблица в 2-3НФ то должны быть ключи.

Задача больше похожа на merge чем insert.

В реляционной алгебре вообще нет такой задачи как копировать столбец. Этож не Excel.
Должна быть привязка к ключевым полям.

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


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

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

Если таблица в 2-3НФ то должны быть ключи.

Задача больше похожа на merge чем insert.

В реляционной алгебре вообще нет такой задачи как копировать столбец. Этож не Excel.
Должна быть привязка к ключевым полям.

Если это - инициализация пустой таблицы - то это надо как-то акцентировать.
Например заранее очистить таблицу. И указать что мы insert-им ключевое поле.


Да, так и есть.

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


Подскажите пожалуйста, PQputCopyData может работать с PQsendQuery?


Или она только под PQexec расчитана?



Суть задачи:

выполнить (COPY TO STDOUT) -> (COPY FROM STDIN)

в несколько потоков.

Может быть она как-то по-другому решается.
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40133053
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем вам для заявленной задачи поможет PQsendQuery?

С copy from stdin в общем проще, открываете N коннектов, каждый из которых переводите в copy from stdin, fifo или round-robin'ом или ещё как жонглируете коннектами. А вот будет ли от этого толк - вопрос отдельных изысканий. Совсем не исключено, что это будет напротив контрпродуктивно относительно одного copy

С copy to stdout - придумайте как нарезать чтение запроса на части, при том в таком виде, чтобы это было быстрее выполнять относительно одного потока copy. Затем разобрать как позаботиться о транзакционной целостности этих параллельных запросов либо обосновать отсутствие необходимости в этом условиями реальной задачи.
А далее идея та же - открываете N коннектов, в каждом делаете copy (select ...) to stdout
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40133058
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij
А чем вам для заявленной задачи поможет PQsendQuery?

С copy from stdin в общем проще, открываете N коннектов, каждый из которых переводите в copy from stdin, fifo или round-robin'ом или ещё как жонглируете коннектами. А вот будет ли от этого толк - вопрос отдельных изысканий. Совсем не исключено, что это будет напротив контрпродуктивно относительно одного copy

С copy to stdout - придумайте как нарезать чтение запроса на части, при том в таком виде, чтобы это было быстрее выполнять относительно одного потока copy. Затем разобрать как позаботиться о транзакционной целостности этих параллельных запросов либо обосновать отсутствие необходимости в этом условиями реальной задачи.
А далее идея та же - открываете N коннектов, в каждом делаете copy (select ...) to stdout



Я не четко сформулировал задачу:

выполнить (COPY TO STDOUT) -> (COPY FROM STDIN)
в несколько потоков с разных серверов.

Т.е. на несколько разных серверов идут одинаковые (COPY TO STDOUT) и они парралельно должны записать данные на другой сервер в одно место.

Т.е. грубо говоря, выполнить один запрос (COPY (SELECT id FROM my_table) TO STDOUT) парралельно на нескольких разных серверах, потратив на это меньше времени по сравнению с последовательным выполнением на каждом и записью результата (COPY my_table FROM STDIN) на один сервер.
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40133062
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,

Хотел уточнить на всякий случай, PQputCopyData может работать с PQsendQuery?

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

ну открываете по коннекту на каждый сервер с которых надо читать, стартуете copy.
На запись можно отправлять построчно даже через один copy from - но в этом случае commit или rollback, конечно, только всего объёма сразу возможен.
Возможно логичнее будет открывать по независимому copy from stdin для каждого источника.

Уткъ
Хотел уточнить на всякий случай, PQputCopyData может работать с PQsendQuery?

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

Как однозначно указано в документации PQputCopyData, функция предусматривает режим работы в неблокирующем режиме.



О. получается можно - отлично!
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40133080
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij
Уткъ,
Уткъ
Хотел уточнить на всякий случай, PQputCopyData может работать с PQsendQuery?

по-прежнему не понимаю зачем.


Ну смотрите, чтобы скопировать данные запроса с 100 серверов, надо последовательно вызвать PQexec 100 раз.
Если запрос выполняется 10 секунд (9 секунд сам запрос и 1 сек копирование) - это уже 17 минут.

Если запустить PQsendQuery то эти 9 секунд можно заспаралелить, и получить не 17 мин, а 1сек*100+9сек+ время на коннект до каждого сервера, т.е. получится около 2-х минут вместо 17.

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

На запись можно отправлять построчно даже через один copy from


тоже думал на счет этого, думал даже чтобы все запросы в один файл дописывали результат селекта и потом этот файл через COPY прогрузить куда надо.

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

Запрос, который данные выбираетможно, а саму PQputCopyData нет?
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40133157
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос №5 Решен.

Благодаря Melkij .

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



Пытаюсь сделать

Код: sql
1.
PQsendQuery



в том же коннекте, где до этого уже было PQsendQuery.



Выдает ошибку:

another command is already in progress


Подскажите что нужно сделать с коннектом, чтобы успешно выполнилось новое PQsendQuery?



Делал вот что:



PQconsumeInput(conn);

PQclear(res);



В итоге перед вызовом (prinntf показывает)

PQisBusy(conn)= 0
PQconsumeInput(conn)= 1


А PQsendQuery все равно с ошибкой
another command is already in progress


Подскажите пожалуйста что еще надо сделать чтобы PQsendQuery успешно запустилась?
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40133214
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PQresultStatus(res) = NULL перед попыnкой запуска PQsendQuery


Скажите что еще можно проверить чтобы PQsendQuery повторно успешно запутилась?
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40135246
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос №6 закрыт
...
Рейтинг: 0 / 0
Изучаю libpq c . Чтобы не плодить темы, создал эту.
    #40135250
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос №7


Не получается сделать чтобы одновременно несколько разных передач данных работало одновременно:

PQputCopyData->PQgetCopyData


Создаю цикл где

Код: sql
1.
while (PQgetCopyData>0)



и в нем внутри делаю на другой коннект

Код: sql
1.
PQputCopyData




Даже с использованием PQsendQuery программа зависает, пока работает цикл.

Нужен пример как это работает в режиме PQsetnonblocking.

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

u.utk(собака).bk.ru
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изучаю libpq c . Чтобы не плодить темы, создал эту.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (2)
Пользователи онлайн (14): Анонимы (11), Bing Bot, Yandex Bot, Google Bot 5 мин.
x
x
Закрыть


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