powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / робота с таблицами из разних бд
31 сообщений из 31, показаны все 2 страниц
робота с таблицами из разних бд
    #38795133
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, мне нужно сравнить таблицы из разных БД, соответствуют ли она друг другу на количество адресов, домов и улиц. По названиям схемы и таблицы идентичны. какой запрос можно использовать в этом случае в POSTGRESQL?
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38795145
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,
Используйте dblink
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38795586
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ARTURV, Я пробовала сделать так CREATE TABLE my_tbl AS SELECT * FROM dblink('dbname=mybd', 'SELECT * FROM my2_tbl') и мне показывает ошыбку ERROR: a column definition list is required for functions returning "record"
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38795596
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,

Как то так
select dblink_connect ('dbname=DB21300Full host=localhost user=postgres password=postgres');
select * from dblink ('select * from имя таблицы where условие') ]as имя таблицы(имя поля тип поля,.......);
Читайте документацию
Прекрасно работает, например, копирую данные из одной БД в другую
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38795599
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ARTURV,Большое спасибо, сейчас буду пробовать. Я просто новичок в этом, еще ни разу не работала с таблицами из разных БД
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38795638
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,
Исправление
select * from dblink ('select список полей from имя таблицы where условие') ]as имя таблицы(имя поля тип поля,.......);
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38795645
RTFM FM FM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38799451
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Незнаю как задать условие, чтобы сделать выборку улиц которые есть в одной таблице а в другой нет. Названия полей, таблиц и схем в БД идентичны. И можно ли использовать команду NOT IN?
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38799472
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже разобралась.
select dblink_connect ('dbname=mydb host=111.11.11.1 user=me password=111111');
SELECT * FROM dblink('dbname=mydb', 'select cod_street, name_street from street_tbl')
AS t1(cod_street_1 INTEGER, name_street_1 VARCHAR) WHERE cod_street_1 not in (select cod_street from street_tbl);
Но очень долго думает и выдает такую ошибку
ERROR: could not establish connection
DETAIL: could not connect to server: Connection timed out
Is the server running on host "111.11.11.1" and accepting
TCP/IP connections on port 1111?
В чем может быть причина ??
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38799473
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересует правильно ли я создала запрос???
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38799494
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХристинаУже разобралась.
Код: sql
1.
2.
3.
4.
select dblink_connect ('dbname=mydb host=111.11.11.1 user=me password=111111');

SELECT * FROM dblink('dbname=mydb', 'select cod_street, name_street from street_tbl')
  AS t1(cod_street_1 INTEGER, name_street_1 VARCHAR) WHERE cod_street_1 not in (select cod_street from street_tbl);


Но очень долго думает и выдает такую ошибку
ERROR: could not establish connection
DETAIL: could not connect to server: Connection timed out
Is the server running on host "111.11.11.1" and accepting
TCP/IP connections on port 1111?
В чем может быть причина ??
во первых если вы создали [неименованное] соедиение dblink_connect()-ом, то имя бд повторно в dblink() отсылать не нужно.


но ошибка у вас еше до этого.
похоже 111.11.11.1 вас (т.е. сервер на котором вы выполняете попытку соединения) не слушает. проверьте [с вашего сервера] или psql-ем ткнитесь к 111.11.11.1, или телнетом по 5432 .
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38799499
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХристинаУже разобралась.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- тут вы пытаетесь соедениться с 111.11.11.1
select dblink_connect ('dbname=mydb host=111.11.11.1 user=me password=111111');
-- и поскольку 111.11.11.1 вас не слушает по 5432 -- получаете ошибку


-- а тут вы пытаетесь использовать [другое] соединение -- уже к локальной БД того же сервера 
-- , на котором запущен и ваш инстанс в котором вы выполняете запрос
-- возможно он бы и отработал (если у вас есть БД mydb и вы суперпользователь)
--, но ошибка у вас выше

SELECT * FROM dblink('dbname=mydb', 'select cod_street, name_street from street_tbl')
  AS t1(cod_street_1 INTEGER, name_street_1 VARCHAR) WHERE cod_street_1 not in (select cod_street from street_tbl);
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38799511
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата, Спасибо за подсказку. Ошибку с повторением исправила. Телнет на компьютере не работает. Какой запрос для проверки в postgresql надо использовать ???
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38799729
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христиналопата, Спасибо за подсказку. Ошибку с повторением исправила. Телнет на компьютере не работает. Какой запрос для проверки в postgresql надо использовать ???

1. нужно убедиться, что 111.11.11.1 слушает вас (тот сервер, на котором вы выполняете запросы) по 5432.

это вообще не про dblink и не про запроосы.
Даже к PosgreSQL может не иметь отношения (только в части postresql.conf [listen_addresses =] + pg_hba.conf)
а например может оказаться вопросом про iptable и прочие фаерволы

вопрос: 111.11.11.1 -- это другая какая-то машина, или вы сами к себе по сетевому интерфейсу ломитесь ?
(если второе -- то уберите из строки подключения host=111.11.11.1 -- станете ходить иначе (через т.н. local pipe, если конечно сервер -- не винда))

далее -- напрягите сетевого администратора, чтобы та машина, к которой вы хотите обратиться, слушала ту машину, с которой dblink обращается (это не та машина [клиент], где вы пишете запрос, а та машина, где запрос, вызывающий dblink, исполняете) по тому сетевому интерфейсу, по которому обращаететсь (host=....). Вот пусть он с телнетом и прочими бубнами походит вокруг.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38800134
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата, Я подключаюсь из дома к удаленному рабочему столу компании А, конектиться стараюсь с БД компании Б в другую БД компании Б. Мне нужно обратиться к администратору компании Б?
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38800228
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,
вам нужно чтобы сервер компании Б[с БД компании Б], видел "другую БД компании Б" (а "другая БД компании Б" слушала (т.е. разрешала соединрение) с 1-м сервером компании Б.

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

Если же там ,на втором сервере, 2 сетевых интерфейса, то возможно вам надо просто обратиться к нему (с первого сервера) по другому ip.

а уж к кому вы обратитесь -- ваше дело.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38808247
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите пожалуйста как с помощью dblink делать INSERT из одной таблицы БД1 в другую с БД2 ???
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38808319
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,

удобнее -- со стороны вставки

Код: sql
1.
2.
3.
4.
5.
6.
7.
INSERT INTO tabdb2 ({list})
SELECT * FROM dblink('condb1name'
$x$SELECT {list} FROM tabdb1
WHERE {db1 where}
$x$) 
AS t ({list typed})
WHERE {db2 WHERE}



хотя можно и наоборот, но там каждую строку данных придется в тексты обращать.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814083
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата, Спасибо!! Сделала запрос по вашим указаниям, но мне выбивает ошибку ERROR: type "serial" does not exist
LINE 73: id_n FROM a_tbl ') AS T (id_a1 SERIAL, nick_a ...
Но там есть поле с типом serial, в чем может быть причина ??? И не нужно делать в этом запросе dblink_connect ??
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814088
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христиналопата, Спасибо!! Сделала запрос по вашим указаниям, но мне выбивает ошибку ERROR: type "serial" does not exist
LINE 73: id_n FROM a_tbl ') AS T (id_a1 SERIAL, nick_a ...
Но там есть поле с типом serial, в чем может быть причина ??? И не нужно делать в этом запросе dblink_connect ??

нет такого типа serial в postgresql
serial это синтаксическая обертка на integer+create sequence+default nextval(...)

PS: вы пытаетесь использовать базу не зная основ и даже не прочитав (не такую уж длинную) документацию.

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814098
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
присоединяюсь к
Maxim Boguk<>
serial это синтаксическая обертка на integer+create sequence+default nextval(...)
<>
+ OWNED BY [for drop cascade when column dropped]

не только ртфм
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814212
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, SELECT работает. Но когда выполняю команду INSERT то выбивает ошибку ERROR: INSERT has more target columns than expressions. Хотя количество полей совпадает, проверяла несколько раз. Может быть проблема в чем-то другом ???
PS Простите, если вам мои вопросы кажутся глупыми, документацию обязательно почитаю еще раз. Я пока только учусь и прошу помощи.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814213
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,

приведите код
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814232
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата,

INSERT INTO a_tbl (id_a,....id_keep_filter)
select dblink_connect ('dbname=db1 host=111.11.11.1 user=user password=111');
SELECT * FROM dblink('SELECT
id_a,.....1,null,null FROM a_tbl')
AS T(id_a,nick_a1 VARCHAR,num_a1 VARCHAR .....id_keep__filter INTEGER)
WHERE num_a1 like '20146';
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814236
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ХристинаМожет быть проблема в чем-то другом ???

Проблема классическая. Находится по другую сторону монитора.

Вы написали какую-то хрень вместо реального текста запроса. Это действительно проблема: делать то, что Вас не просят.

А мелкие глупые вопросы не читавших документацию - здесь к ним привыкли, отвечают вполне спокойно.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814243
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христиналопата,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
-- это отдельный запрос,
select dblink_connect ('dbname=db1 host=111.11.11.1 user=user password=111');
-- он открывает неименованное [в вашем случае] соединение.

-- а вот как-то так должен выглядеть ваш запрос
--// который должен исполняться в том же сеансе, что и передыдущий 
-- открытие соединения

INSERT INTO a_tbl (id_a,....id_keep_filter)

SELECT * FROM dblink('SELECT
id_a,.....1,null,null FROM a_tbl')
AS T(id_a,nick_a1 VARCHAR,num_a1 VARCHAR .....id_keep__filter INTEGER)
WHERE num_a1 like '20146';





т.е. схема проста: в сеансе вы "открываете" встроенного клиента к другой бД -- открыватее соединение.
а дальше в нем, в открытом соединении, делаете свое черное дело -- запрашиваете на свою сторону сторониие данные, или напротив, выполняете dml [и даже ddl] на стороне.

единственное отличие [от обычных клиентов] -- вы получаете не "рекордсеты" и т.п. объекты, а табличные наборы, которые можете джойнить (с объектами местной бд), фильтровать и т.п. средствами SQL.

PS при такой плотности общения с темой, лет за 5 вы научитесь что-то передавать туда и обратно. не надо боятся приводить ошибочный код, а тем паче его писать , и тут же смотреть образцы в rtfm.
кожение -- это наработка рефлексов , большей частью. Редко, когда требуется что-то большее.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814245
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\ХристинаМожет быть проблема в чем-то другом ???

Проблема классическая. Находится по другую сторону монитора.

Вы написали какую-то хрень вместо реального текста запроса. Это действительно проблема: делать то, что Вас не просят.

А мелкие глупые вопросы не читавших документацию - здесь к ним привыкли, отвечают вполне спокойно.скорее всего ТС написал[а] (сократив) то, что пыталась выполнить --
т.е. всавить в таблицу возврат dblink_connect (который, как известно -- строка, если я ничего не запамятовал).
на это и произошла упомянутая выше ругань -- возврат "Ok" не захотел ложиться в кучку полей, несколько более числом, чем 1.

а дальнейший запрос -- который оказался просто выборкой из открытого соединеия (и никуда не собирался вставиться, а просто был синтаксически безвредным) -- просто не выполнился по причине ошибки в предыдущем стейтменте батча.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814299
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата,

Последний запрос - это не просто выборка.
Там зачем-то выбираются значения NULL, которые можно выбрать на клиенте, а не на удаленном сервере. И фильтрация так же идет на клиенте, а не на удаленном сервере.
То есть получаем большее количество строк с более широкими записями. Это совершенно не нужно.

А так да, автору можно попробовать обратиться к форме вызова процедуры:
Код: sql
1.
dblink(text connstr, text sql [, bool fail_on_error]) returns setof record


Это из RTFM .

После того, как этот запрос заработает с выборкой нужного количества полей и строк, к нему сверху можно приписать конструкцию INSERT INTO .... (....) для непосредственной вставки.

Если автор желает воспользоваться именованными соединениями, то настоятельно рекомендую обернуть в анонимные блоки.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814341
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\лопата,

Последний запрос - это не просто выборка.
Там зачем-то выбираются значения NULL, которые можно выбрать на клиенте, а не на удаленном сервере. И фильтрация так же идет на клиенте, а не на удаленном сервере.
То есть получаем большее количество строк с более широкими записями. Это совершенно не нужно.

А так да, автору можно попробовать обратиться к форме вызова процедуры:
Код: sql
1.
dblink(text connstr, text sql [, bool fail_on_error]) returns setof record


Это из RTFM .

После того, как этот запрос заработает с выборкой нужного количества полей и строк, к нему сверху можно приписать конструкцию INSERT INTO .... (....) для непосредственной вставки.

Если автор желает воспользоваться именованными соединениями, то настоятельно рекомендую обернуть в анонимные блоки.

узбагойтеса, имелось в виду, что "пазледний заброз" никуда не вставляедза.
а пытаедся вставидса аккурат возврат дблинк-коннекта.

в ртфм афтара отсылали недели 2 тому. но афтар боицца чо-то делать руками в темпе чуть быстрее, чем одна попытка в неделю.
т.ч. тут напирать с особостями работы клиента с БД (т.е. разъяснять, что фильтрация дешевле на сервере, чем на клиенте) -- пока рано, евпочя. пусть хоть что-то начнёт делать.

такошто зо всеми вашими зловесами в предыдущем постинге згорее зогласен

я бы вощбе рекомендовал аффтару начать с получения SELECT 1; с удаленного сервера, ну или чего попроще из информативного -- SELECT version(); SELECT pg_.....()
т.е. с примитивов,
постепенно обдумывая, что же происходит на той стороне.



а анонимные блоки вовсе не обязательны, если вы сами контролируете сеанс, или транзакцию (не отдавая пулеру возможность подменить вам соединение) , но в большинстве сложных случаев -- удобны.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814353
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,

вот примерно таких пассов руками поделайте:

наработка рефлексов
Код: sql
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
create extension IF NOT EXISTS dblink;
-- без предустановки соединения:
SELECT * FROM dblink('dbname=test password=postgres','SELECT 1;') AS 
	t (f integer);
-- 1

-- проверка, что соединение, в таком случае, не держится:
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
-- ERROR: connection not available
-- SQL-состояние: 08003
-- открытие явного неименованного соединения
SELECT dblink_connect('dbname=test password=postgres');
-- OK
-- проверка, что соединение, в таком случае, держится:
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
-- 1
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
-- 1
-- закрытие неименованного соединения:
SELECT dblink_disconnect();
--'OK'
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
--ERROR: connection not available
--SQL-состояние: 08003

-- открытие именованного соединения 
SELECT dblink_connect('test connection','dbname=test password=postgres');
-- OK
SELECT dblink_connect('test connection','dbname=test password=postgres');
--ERROR: duplicate connection name
--SQL-состояние: 42710
-- попытка  использо как неименое
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
--ERROR: connection not available
--SQL-состояние: 08003
SELECT * FROM dblink('test connection','SELECT 1;') AS t (f integer);
-- 1
SELECT * FROM dblink('test connection','SELECT version();') AS t (f text);
--'PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc...
--
SELECT dblink_get_connections();
-- '{"test connection"}'
SELECT * FROM dblink('test connection','SELECT dblink_get_connections();') AS t (f text);
--RROR: function dblink_get_connections() does not exist
--SQL-состояние: 42883
SELECT * FROM dblink('test connection','create extension IF NOT EXISTS dblink;SELECT dblink_get_connections();') AS t (f text);
--'OK'
SELECT * FROM dblink('test connection','SELECT dblink_connect(''test connection'',''dbname='||current_database() ||' password=postgres'');') AS t (f text);
--'OK'
SELECT * FROM dblink('test connection','SELECT dblink_get_connections();') AS t (f text);
-- '{"test connection"}'
SELECT * FROM dblink('test connection','SELECT * FROM dblink(''test connection'', ''SELECT current_database()'') AS t (f text) ;') AS t (f text);
--'testdb'
SELECT * FROM dblink('test connection','SELECT * FROM dblink($$test connection$$,$x$SELECT dblink_connect($$test connection$$,$$dbname=test password=postgres$$);$x$) AS t (f text)') AS t (f text);
--'OK'
SELECT * FROM dblink('test connection','SELECT * FROM dblink($$test connection$$,$x$SELECT dblink_get_connections();$x$) AS t (f text)') AS t (f text);

SELECT current_database(), dblink_get_connections(),pg_backend_pid();
-- 'testdb','{"test connection"}',3558
SELECT * FROM dblink('test connection','SELECT * FROM dblink($$test connection$$,$x$SELECT current_database(), dblink_get_connections(),pg_backend_pid();;$x$)
	AS t (f text, f2 text[],f3 integer)')
	AS t (f text, f2 text[],f3 integer);
-- 'testdb','{"test connection"}',3707
--Внимание, впорос: почему  в одной БД 2 одноименных соединения  разных сеансах [PID] ?


...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38816126
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата,Все пошло, все работает, очень Вам благодарна !!!
авторPS при такой плотности общения с темой, лет за 5 вы научитесь что-то передавать туда и обратно.
Я знаю, просто у меня еще маленький ребенок и мало свободного времени
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / робота с таблицами из разних бд
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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