Transférer des données entre bases de données avec PostgreSQL

Je dois transférer des données d’une autre firebase database. L’ancienne firebase database s’appelle paw1.moviesDB et la nouvelle firebase database est paw1. Le schéma de chaque table est le suivant.

Awards (name of the table)(new DB) Id [PK] Serial Award Nominations (name of the table) (old DB) Id [PK] Serial nominations 

Comment copier les données de l’ancienne firebase database vers la nouvelle firebase database?

Je devais juste faire cette chose exacte alors j’ai pensé que je posterais la recette ici. Cela suppose que les deux bases de données sont sur le même serveur.

Tout d’abord, copiez la table de l’ancienne firebase database vers la nouvelle firebase database (car apparemment vous ne pouvez pas déplacer les données entre les bases de données). En ligne de commande:

 pg_dump -U postgres -t   | psql -U postgres -d  

Ensuite, accordez les permissions de la table copiée à l’utilisateur de la nouvelle firebase database. Connectez-vous à psql:

 psql -U postgres -d  ALTER TABLE  OWNER TO ; \q 

Enfin, copiez les données de l’ancienne table dans la nouvelle table. Connectez-vous en tant que nouvel utilisateur, puis:

 INSERT INTO  (field1, field2, field3) SELECT field1, field2, field3 from ; 

Terminé!

Les bases de données sont isolées dans PostgreSQL; Lorsque vous vous connectez à un serveur PostgreSQL que vous connectez à une seule firebase database, vous ne pouvez pas copier de données d’une firebase database à une autre en utilisant une requête SQL.

Si vous venez de MySQL: ce que MySQL appelle (vaguement) les ” bases de données ” sont des ” schémas ” dans PostgreSQL – une sorte d’espaces de noms. Une firebase database PostgreSQL peut avoir plusieurs schémas, chacun avec ses tables et ses vues, et vous pouvez copier d’un schéma à un autre avec la syntaxe schema.table .

Si vous avez vraiment deux bases de données PostgreSQL distinctes, le moyen le plus courant de transférer des données de l’une à l’autre serait d’exporter vos tables (avec pg_dump -t ) dans un fichier et de les importer dans l’autre firebase database (avec psql ).

Si vous avez vraiment besoin d’obtenir des données d’une firebase database PostgreSQL distincte, une autre option – mentionnée dans la réponse de Grant Johnson – est dblink , qui est un module supplémentaire (dans consortingb/ ).

Cela a fonctionné pour moi de copier une table à distance de mon localhost au postgresql de Heroku:

pg_dump -C -t source_table -h localhost source_db | psql -h destination_host -U destination_user -p destination_port destination_db

Cela crée la table pour vous.

Pour l’autre sens (de Heroku vers local) pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db pg_dump -C -t source_table -h source_host -U source_user -p source_port source_db | psql -h localhost destination_db

Il y a trois options pour le copier s’il s’agit d’une seule pièce:

  1. Utilisez un db_link (je pense qu’il est toujours dans consortingb)
  2. Demandez à l’application de faire le travail.
  3. Export / import

S’il s’agit d’un besoin permanent, les réponses sont les suivantes:

  1. Passer aux schémas dans la même firebase database
  2. db_link

De: hxxp: //dbaspot.c om / postgresql / 348627-pg_dump-t-give-where-condition.html ( NOTE: le lien est maintenant cassé )

 # create tmp db with the data psql mydb CREATE TABLE temp1 (LIKE mytable); INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions; \q # export the data pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql psql mydb DROP TABLE temp1; \q # import temp1 somewhere cat out.sql | psql -d [other_db] psql other_db INSERT INTO mytable (SELECT * FROM temp1); DROP TABLE temp1; 

Une autre méthode utile dans les télécommandes

  psql-remote> COPY elements TO '/tmp/elements.csv' DELIMITER ',' CSV HEADER; $ scp host.com:/tmp/elements.csv /tmp/elements.csv psql-local> COPY elements FROM '/tmp/elements.csv' DELIMITER ',' CSV; 

Tout comme le suggère leonbloy, il est préférable d’utiliser deux schémas dans une firebase database. Supposons un schéma source (ancienne firebase database) et un schéma cible (nouvelle firebase database), vous pouvez essayer quelque chose comme ça (vous devez considérer les noms de colonne, les types, etc.):

 INSERT INTO target.Awards SELECT * FROM source.Nominations; 

Vous ne pouvez pas effectuer une requête croisée comme SQL Server. PostgreSQL ne supporte pas cela.

L’extension DbLink de PostgreSQL permet de connecter une firebase database à une autre firebase database. Vous avez installé et configuré DbLink pour exécuter une requête inter-firebase database.

J’ai déjà créé un script pas à pas et un exemple pour exécuter une requête de firebase database croisée dans PostgreSQL. S’il vous plaît visitez ce post: PostgreSQL [Vidéo]: requêtes de firebase database croisées en utilisant l’extension DbLink

En fait, il existe une possibilité d’envoyer une table de données d’une firebase database PostgreSQL à une autre. J’utilise le langage procédural plperlu (langage procédural de Perl dangereux) pour cela.

Description (tout a été fait sur un serveur Linux):

  1. Créer un langage plperlu dans votre firebase database A

  2. Ensuite, PostgreSQL peut joindre certains modules Perl via une série de commandes à la fin de postgresql.conf pour la firebase database A:

     plperl.on_init='use DBI;' plperl.on_init='use DBD::Pg;' 
  3. Vous construisez une fonction dans A comme ceci:

     CREATE OR REPLACE FUNCTION send_data( VARCHAR ) RETURNS character varying AS $BODY$ my $command = $_[0] || die 'No SQL command!'; my $connection_ssortingng = "dbi:Pg:dbname=your_dbase;host=192.168.1.2;port=5432;"; $dbh = DBI->connect($connection_ssortingng,'user','pass', {AutoCommit=>0,RaiseError=>1,PrintError=>1,pg_enable_utf8=>1,} ); my $sql = $dbh-> prepare( $command ); eval { $sql-> execute() }; my $error = $dbh-> state; $sql-> finish; if ( $error ) { $dbh-> rollback() } else { $dbh-> commit() } $dbh-> disconnect(); $BODY$ LANGUAGE plperlu VOLATILE; 

Et puis vous pouvez appeler la fonction dans la firebase database A:

 SELECT send_data( 'INSERT INTO jm (jm) VALUES (''zzzzzz'')' ); 

Et la valeur “zzzzzz” sera ajoutée dans la table “jm” dans la firebase database B.