199 votes

Est-il possible d'effectuer des requêtes sur plusieurs bases de données avec PostgreSQL ?

Je suppose que la réponse est "non" d'après le message d'erreur ci-dessous (et ce résultat Google ), mais existe-t-il un moyen d'effectuer une requête entre bases de données en utilisant PostgreSQL ?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

Je travaille avec des données qui sont réparties dans deux bases de données bien que les données soient réellement partagées entre les deux (les colonnes userid dans une base de données proviennent de la base de données users dans l'autre base de données). Je n'ai aucune idée de la raison pour laquelle il s'agit de deux bases de données distinctes au lieu d'un schéma, mais c'est la vie...

154voto

Neall Points 12075

Note : Comme l'a laissé entendre l'auteur de la question, si vous créez deux bases de données sur la même machine, vous voudrez probablement créer deux schémas dans ce cas, vous n'avez besoin de rien de spécial pour les interroger.

postgres_fdw

Utilisation postgres_fdw (foreign data wrapper) pour se connecter aux tables de n'importe quelle base de données Postgres - locale ou distante.

Il convient de noter qu'il existe des wrappers de données étrangères pour d'autres sources de données populaires . A l'heure actuelle, seuls postgres_fdw y file_fdw font partie de la distribution officielle de Postgres.

Pour les versions de Postgres antérieures à 9.3

Les versions aussi anciennes ne sont plus prises en charge, mais si vous avez besoin de le faire dans une installation Postgres antérieure à 2013, il existe une fonction appelée dblink .

Je ne l'ai jamais utilisé, mais il est maintenu et distribué avec le reste de PostgreSQL. Si vous utilisez la version de PostgreSQL fournie avec votre distribution Linux, vous devrez peut-être installer un paquetage appelé postgresql-contrib.

1 votes

Nécessité d'installer postgresql-contrib antes de dblink ? Ou postgresql-contrib comprend dblink ? La requête de l'OP fonctionnera alors, ou devez-vous l'interroger différemment ?

3 votes

D'après ce que j'ai pu lire, dblink ne gère pas le cas où vous voulez une requête qui s'étend sur deux bases de données.

1 votes

Mais pour ce qui est de la performance et de la simplicité quand fdw la table n'est pas éloignée Comme dans la question, toutes les bases de données croisées sont locales et se trouvent dans le même cluster ? Toutes la documentation porte sur "remote database" (base de données à distance) ( !) et ne rien dire à propos de la "base de données locale"... Il y a quelques simplifications et/ou quelques gains de performance lorsque toutes les bases de données sont locales ?

64voto

Manwal Points 17668

dblink() -- exécute une requête dans une base de données distante

dblink exécute une requête (généralement un SELECT, mais il peut s'agir de n'importe quelle requête SQL qui renvoie des lignes) dans une base de données distante.

Lorsque deux arguments textuels sont donnés, le premier est d'abord recherché en tant que le nom d'une connexion persistante ; s'il est trouvé, la commande est exécutée sur cette connexion. S'il n'est pas trouvé, le premier argument est traité comme un nom de connexion persistant. chaîne d'information sur la connexion, comme pour dblink_connect, et la connexion indiquée est établie. est établie juste pour la durée de cette commande.

l'un des bons exemples :

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;

Note : Je donne ces informations pour référence future. Référence

25voto

stimms Points 14986

J'ai déjà rencontré ce problème et j'en suis arrivé à la même conclusion que vous en ce qui concerne les requêtes inter-bases de données. Ce que j'ai fini par faire, c'est utiliser des schémas pour diviser l'espace des tables, de manière à pouvoir conserver les tables groupées tout en les interrogeant toutes.

20 votes

Si vous venez d'un environnement MySQL, ce que MySQL appelle des bases de données sont en fait des schémas (CREATE SCHEMA == CREATE DATABASE dans MySQL), donc si vous portez quelque chose depuis MySQL en utilisant plusieurs bases de données, utilisez des schémas.

11voto

voyager Points 17283

Juste pour ajouter un peu plus d'informations.

Il n'existe aucun moyen d'interroger une base de données autre que la base actuelle. Parce que PostgreSQL charge des catalogues système spécifiques aux bases de données, il n'est pas certain qu'une requête inter-bases de données puisse se comporter de la sorte.

contrib/dblink permet d'effectuer des requêtes entre bases de données à l'aide d'appels de fonctions. Bien entendu, un client peut également se connecter simultanément à différentes bases de données et fusionner les résultats du côté client.

FAQ PostgreSQL

6 votes

Ces informations supplémentaires peuvent être trompeuses et décourager les utilisateurs de recourir à la solution ci-dessus.

6voto

Oui, vous pouvez utiliser DBlink (postgresql uniquement) et DBI-Link (qui permet d'interroger des bases de données étrangères) et TDS_LInk qui permet d'exécuter des requêtes sur MS SQL Server.

J'ai déjà utilisé DB-Link et TDS-link avec succès.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X