web-dev-qa-db-fra.com

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

J'ai besoin de transférer des données d'une autre base de données. L'ancienne base de données s'appelle Paw1.moviesDB et la nouvelle base de données 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 base de données vers la nouvelle base de données?

47
Nicopuri

Je devais juste faire exactement cela, alors j'ai pensé que je publierais la recette ici. Cela suppose que les deux bases de données se trouvent sur le même serveur.

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

pg_dump -U postgres -t <old_table> <old_database> | psql -U postgres -d <new_database>

# Just adding extra space here so scrollbar doesn't hide the command

Ensuite, accordez les autorisations de la table copiée à l'utilisateur de la nouvelle base de données. Connectez-vous à psql:

psql -U postgres -d <new_database>

ALTER TABLE <old_table> OWNER TO <new_user>;

\q

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

INSERT INTO <new_table> (field1, field2, field3) 
SELECT field1, field2, field3 from <old_table>;

Terminé!

70
Nate

Les bases de données sont isolées dans PostgreSQL; lorsque vous vous connectez à un serveur PostgreSQL vous vous connectez à une seule base de données, vous ne pouvez pas copier les données d'une base de données à une autre à l'aide d'une requête SQL.

Si vous venez de MySQL: ce que MySQL appelle (vaguement) " les bases de données " sont "schémas "dans PostgreSQL - sorte d'espaces de noms. Une base de données PostgreSQL peut avoir plusieurs schémas, chacun avec ses tables et ses vues, et vous pouvez copier d'un schéma à un autre avec le schema.table syntaxe.

Si vous avez vraiment deux bases de données PostgreSQL distinctes, la façon courante de transférer des données de l'une à l'autre serait d'exporter vos tables (avec pg_dump -t ) dans un fichier et importez-les dans l'autre base de données (avec psql).

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

33
leonbloy

Cela a fonctionné pour moi de copier une table à distance de mon hôte local vers le 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 au local) pg_dump -C -t source_table -h source_Host -U source_user -p source_port source_db | psql -h localhost destination_db

20
crizCraig

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

# create temp table with the data
psql mydb
CREATE TABLE temp1 (LIKE mytable);
INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions;
\q

# export the data to a sql file
pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql
psql mydb
DROP TABLE temp1;
\q

# import temp1 rows in another database
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

  # export a table csv and import in another database
  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;
11
Thiago Macedo

Il existe trois options pour le copier si celui-ci est unique:

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

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

  1. Passer aux schémas dans la même base de données
  2. db_link
8
Grant Johnson

En fait, il est possible d'envoyer des données de table d'une base de données PostgreSQL à une autre. J'utilise pour cela le langage procédural plperlu (langage procédural Perl dangereux).

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

  1. Créez le langage plperlu dans votre base de données A

  2. PostgreSQL peut ensuite rejoindre certains modules Perl via une série de commandes suivantes à la fin de postgresql.conf pour la base de données A:

    plperl.on_init='use DBI;'
    plperl.on_init='use DBD::Pg;'
    
  3. Vous créez une fonction en A comme ceci:

    CREATE OR REPLACE FUNCTION send_data( VARCHAR )
    RETURNS character varying AS
    $BODY$
    my $command = $_[0] || die 'No SQL command!';
    my $connection_string =
    "dbi:Pg:dbname=your_dbase;Host=192.168.1.2;port=5432;";
    $dbh = DBI->connect($connection_string,'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 base de données A:

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

Et la valeur "zzzzzz" sera ajoutée dans la table "jm" de la base de données B.

0
francisco

Vous ne pouvez pas effectuer une requête entre bases de données comme SQL Server; PostgreSQL ne prend pas cela en charge.

L'extension DbLink de PostgreSQL est utilisée pour connecter une base de données à une autre base de données. Vous devez installer et configurer DbLink pour exécuter une requête entre bases de données.

J'ai déjà créé un script étape par étape et un exemple pour exécuter une requête de base de données croisée dans PostgreSQL. Veuillez visiter cet article: PostgreSQL [Video]: Cross Database Queries using the DbLink Extension

0
Anvesh

Tout comme l'a suggéré leonbloy, l'utilisation de deux schémas dans une base de données est la voie à suivre. Supposons un schéma source (ancienne base de données) et un schéma cible (nouvelle base de données), vous pouvez essayer quelque chose comme ceci (vous devriez considérer les noms de colonne, les types, etc.):

INSERT INTO target.Awards SELECT * FROM source.Nominations;
0
Federico Cristina