Как присоединиться к таблице, которая находится в другой базе данных в postgres [duplicate]

import pandas as pd
k=pd.DataFrame(['hello','doubt','hero','help'])
k.columns=['some_thing']
t=k[k['some_thing'].str.contains("hel")]
d=k.replace(t,'CS')

::: OUTPUT :::

k
Out[95]: 
   some_thing
0  hello
1  doubt
2  hero
3   help

t
Out[99]: 
   some_thing
0  hello
3   help

d
Out[96]: 
    some_thing
0     CS
1  doubt
2  hero
3     CS
112
задан Tom H 7 July 2010 в 21:12
поделиться

6 ответов

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

Обновление с 9.3

Теперь вы можете использовать новую postgres_fdw (внешнюю обертку данных) для подключаться к таблицам в любой базе данных Postgres - локальном или удаленном.

Обратите внимание, что есть внешние обертки данных для других популярных источников данных . В настоящее время только postgres_fdw и file_fdw являются частью официального дистрибутива Postgres.

Оригинальный ответ для pre-9.3

Эта функция не является частью PostgreSQL по умолчанию install, но вы можете добавить его. Он называется dblink .

Я никогда не использовал его, но он поддерживается и распространяется вместе с остальной частью PostgreSQL. Если вы используете версию PostgreSQL, поставляемую с дистрибутивом Linux, вам может потребоваться установить пакет postgresql-contrib.

80
ответ дан Neall 21 August 2018 в 17:29
поделиться
  • 1
    Вам нужно установить postgresql-contrib перед dblink? Или postgresql-contrib включает dblink? И тогда запрос OP будет работать, или вы должны запросить его по-другому? – mpen 19 June 2011 в 20:59
  • 2
    Есть проблемы с производительностью, о которых мне нужно будет беспокоиться? – sam yi 6 March 2012 в 17:59
  • 3
    Из того, что я могу прочитать, dblink не обрабатывает случай, когда вам нужен запрос, который охватывает две базы данных. – Paul Tomblin 27 March 2012 в 01:04

dblink () - выполняет запрос в удаленной базе данных

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

Когда указаны два текстовых аргумента, первый сначала рассматривается как имя постоянного соединения; если он найден, команда выполняется по этому соединению. Если не найден, первый аргумент рассматривается как строка информации о соединении, как для dblink_connect, и указанное соединение выполняется только для продолжительности этой команды.

один из хороших примеров:

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

Примечание: Я даю эту информацию для дальнейшего использования. Refrence

11
ответ дан 2 revs 21 August 2018 в 17:29
поделиться

Если производительность важна, и большинство запросов доступны только для чтения, я бы предложил реплицировать данные в другую базу данных. Хотя это похоже на ненужное дублирование данных, это может помочь, если требуются индексы.

Это можно сделать с помощью простых триггеров вставки, которые в свою очередь вызывают dblink для обновления другой копии. Есть также полномасштабные варианты репликации (например, Slony), но это не по теме.

2
ответ дан dpavlin 21 August 2018 в 17:29
поделиться

Просто добавьте немного дополнительной информации.

Невозможно запросить базу данных, отличную от текущей. Поскольку PostgreSQL загружает системные каталоги, зависящие от базы данных, неясно, как должен вести себя запрос кросс-баз данных.

contrib / dblink разрешает запросы с кросс-базами, используя вызовы функций. Конечно, клиент может также делать одновременные подключения к различным базам данных и объединять результаты на стороне клиента.

Часто задаваемые вопросы по PostgreSQL

9
ответ дан Esteban Küber 21 August 2018 в 17:29
поделиться
  • 1
    Эта дополнительная информация может вводить в заблуждение и может препятствовать пользователям использовать вышеупомянутое решение. – johan855 12 January 2017 в 11:47

Я столкнулся с этим до того, как пришел к тому же выводу о кросс-запросах базы данных, как и вы. То, что я закончил, было использование схем для разделения табличного пространства таким образом, чтобы я мог хранить таблицы сгруппированными, но все еще запрашивать их все.

18
ответ дан stimms 21 August 2018 в 17:29
поделиться
  • 1
    Если вы исходите из среды MySQL, то, что MySQL вызывает базы данных, - это действительно схемы (CREATE SCHEMA == CREATE DATABASE в MySQL), поэтому, если вы портируете что-то из MySQL с использованием нескольких баз данных, используйте схемы – MkV 7 May 2010 в 03:11

Да, вы можете использовать DBlink (только postgresql) и DBI-Link (разрешить внешние кросс-серверы) и TDS_LInk, который позволяет запускать запросы к серверу MS SQL.

Я использовал DB- Link и TDS-link с большим успехом.

5
ответ дан user 21 August 2018 в 17:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: