2011-07-16 14 views
5

Czy każdy może podać przykład (z różnymi instrukcjami SQL), jak korzystać z obcojęzycznych wrapperów danych w postgresql, aby włączyć tabelę z bazy danych PostgreSQL, która ma zostać dołączona do tabeli z bazy danych B postgresql?Jak korzystać z zapełniacza danych zagranicznych PostgreSQL w celu dołączenia do 2 różnych baz danych PostgreSQL

Z dokumentów nie wynika, w jakim stopniu funkcjonalność FDW jest dostępna w pgsql 9.0 w porównaniu z 9.1. Dokumenty również nie mają żadnych przykładów, które pokazują, w jaki sposób połączyć się z 2 różnymi bazami danych PostgreSQL (z naciśniętym klawiszem WHERE) przy użyciu FDW.

http://www.postgresql.org/docs/9.0/static/sql-createforeigndatawrapper.html

http://www.postgresql.org/docs/9.1/static/ddl-foreign-data.html

http://www.depesz.com/index.php/2011/03/14/waiting-for-9-1-foreign-data-wrapper/

Odpowiedz

6

można manipulować tak jak każdy stół. ZA Depesz”post:

CREATE FOREIGN TABLE passwd (
    username text, 
    pass text, 
    uid int4, 
    gid int4, 
    gecos text, 
    home text, 
    shell text 
) SERVER file_server 
OPTIONS (format 'text', filename '/etc/passwd', delimiter ':', null ''); 

select * from passwd; 

Docs nie mają przykłady łączenia tabel za dobry powód: to zwykły stary SQL ...

Dołącz push-down jest obecnie przedmiotem GSoC:

+1

Podany przykład dotyczy "file_server". Czy możesz edytować przykład, aby połączyć się z zewnętrznym serwerem postgresql? Dzięki. – archmeta

+0

To będzie ten sam rodzaj składni z innym serwerem. Zobacz odpowiednie dokumenty tutaj: http://www.postgresql.org/docs/current/static/sql-createserver.html/'CREATE SERVER myserver ZAGRANICZNE DANE WRAPPER pgsql OPCJE (host 'foo', dbname 'foodb', port ' 5432 '); ' –

+0

Pojawia się błąd" BŁĄD: opakowanie danych zagranicznych "pgsql" nie istnieje "na moim 9.1 - Jakieś pomysły, których mi brakuje? Dzięki – alfonx

3

Najprostszym rozwiązaniem, które znalazłem, jest rozszerzenie dblink . Testowałem go na PostgreSQL 9.1:

create extension dblink. 
select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 
        'select id,spaltenname from variablen') as v (a int, b varchar(20)); 

http://www.postgresql.org/docs/9.1/static/dblink.html

Prosty dołączyć byłoby:

with a as (select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 'select id,spaltenname from variablen') as v (a int, b varchar(20))) 
select a join (select 1)b on (true); 

Powyższy przykład pozwala połączyć ze stołem na inny serwer PostgreSQL, ale jest po prostu kopię, a następnie dołącz. Brak automatycznego zakodowania "WHERE pushering down", jak go nazwałeś. Można oczywiście wybrać tylko te linie, gdzie trzeba je w pierwszym piśmie ...

1

Jeśli chcesz dołączyć do 2 różnych baz danych PostgreSQL polecam użyć dblink:

select datos.* 
    FROM dblink('hostaddr=192.168.0.10 port=5432 dbname=my_dbname user=my_user password=my_pass'::text, ' 
       select field_1, field_2 
       from my_table order by field_1 
       ' 
       ::text) 
     datos(field_1, integer, field_2 character varying(10)); 

(testowałem go na PostgreSQL 9.1.3) http://www.postgresql.org/docs/9.2/static/contrib-dblink-function.html

Powiązane problemy