http://www.postgresql-support.de

COPY verwenden

Wie wir in den letzten Abschnitten bereits gesehen haben, können Sie COPY verwenden, um größere Datenmengen mit PostgreSQL auszutauschen.

Um die grundlegende Funktionsweise zu demonstrieren, verwenden wir die folgende Tabelle:

test=# CREATE TABLE t_data (id int4, name text);
CREATE TABLE

Versuchen wir nun, Daten in die Tabelle einzufügen:

#!/usr/bin/perl

use DBD::Pg;

# datenbankverbindung aufbauen
my $dbh = DBI->connect("dbi:Pg:dbname=test;host=localhost;port=5432",
        "hs", "");

$dbh->begin_work();
$dbh->do("COPY t_data FROM stdin");
$dbh->pg_putline("1\tHans\n");
$dbh->pg_putline("2\tPeter\n");
$dbh->pg_putline("3\tJosef\n");
$dbh->pg_endcopy;
$dbh->commit();

Wir führen die gesamte Operation innerhalb einer Transaktion aus. Das ist in unserem Fall notwendig, da sich DBI sonst über einen Speicherzugriffsfehler beklagt. In weiterer Folge starten wir den COPY-Command und fügen die Datenzeilen der Reihe nach ein. Die Spalten sind im einfachsten Fall durch einen Tabulator getrennt und werden mit einem Linefeed abgeschlossen.

Wenn wir das Script laufen lassen, erhalten wir die folgenden Daten:

test=# SELECT * FROM t_data;
 id | name
----+-------
  1 | Hans
  2 | Peter
  3 | Josef
(3 rows)

Nachdem wir den Datenbestand importiert haben, wollen wir die Daten auch wieder extrahieren. Zu diesem Zwecke können wir wieder COPY verwenden:

#!/usr/bin/perl

use DBD::Pg;
use strict;

# datenbankverbindung aufbauen
my $dbh = DBI->connect("dbi:Pg:dbname=test;host=localhost;port=5432",
        "hs", "");

$dbh->begin_work();
my @data;
my $x = 0;

$dbh->do("COPY t_data TO stdout");
1 while ($dbh->pg_getline($data[$x++], 100));
pop @data;

print "data:\n @data\n";

$dbh->commit();

In diesem Fall gehen wir den Datenbestand so lange durch bis keine Daten mehr gefunden werden können. In diesem Beispiel lesen wir die einzelnen Datensätze einfach in einen Buffer ein und geben das Ergebnis wie folgt aus:

[hs@localhost tmp]$ ./test.pl
data:
 1      Hans
 2      Peter
 3      Josef

COPY kann sehr einfach verwendet werden und stellt den Programmierer kaum vor nennenswerte Herausforderungen. Vor allem im Hinblick auf die Performance des Systems wird Ihnen COPY massiv helfen.

http://www.postgresql.at