1153282

Arbeiten mit PostgreSQL-Tabellen

19.04.2012 | 11:39 Uhr |

Tabellenbetrachtung

Nun wollen wir Tabellen betrachten, während wir in der postgres DB sind. Als erstes lassen wir uns die System-Tabelle anzeigen:

postgres=# \dtS List of relations

Schema

Name

Type

Owner

pg_catalog

pg_aggregate

table

postgres

pg_catalog

pg_am

table

postgres

pg_catalog

pg_amop

table

postgres

Was ist in der pg_am Tabelle?

postgres=# \d pg_am Table "pg_catalog.pg_am"

Column

Type

Modifiers

amname

name

not null

amstrategies

smallint

not null

amsupport

smallint

not null

amcanorder

boolean

not null

[...]

amcostestimate

regproc

not null

amoptions

regproc

not null

Indexes: "pg_am_name_index" UNIQUE, btree (amname) "pg_am_oid_index" UNIQUE, btree (oid)

Das ist nur die Tabellenstruktur, ohne Daten. Es zeigt die Zeilennamen, die Datei-Art für jede Spalte und alle optionalen Modifikationen. Versuchen Sie Ihre eigene Tabelle in Ihrer Test-Datenbank zu erstellen. Diese Tabelle kann beispielsweise eine Comic-Sammlung beschreiben:

CREATE TABLE comics ( name varchar(80), publisher varchar(80), date_published date );

Sie können dies kopieren und direkt in Ihre psql- Eingabeaufforderung eingeben:

testdb=# CREATE TABLE comics ( testdb(# name varchar(80), testdb(# publisher varchar(80), testdb(# date_published date testdb(# ); CREATE TABLE testdb=#

Die Kommata sagen psql , wo die Zeile endet und die Semikolons bestimmen das Ende Ihres Kommandos. Probieren Sie die bisher gelernten Kommandos an Ihrer Test-Datenbank aus. Erstellen Sie neue Tabellen und betrachten Sie diese mit DROP TABLE tablename;

Tabellen mit Daten füllen

Wir haben bereits eine kleine Beispiel-Tabelle mit Comics erstellt. Wir haben auch gelernt, wie alle Tabellen in unserer Datenbank angezeigt werden können, inklusiver der System-Tabellen, die immer vorhanden sind. Dieser Befehl lässt nur die Tabellen, die wir erstellt haben anzeigen:

testdb=# \dt List of relations

Schema

Name

Type

Owner

public

comics

table

carla

Da derzeit nur die Tabellenstruktur definiert wurde, wollen wir diese nun mit Daten befüllen. Tabellen haben Zeilen und Spalten. Jede Spalte enthält einen spezifischen Datei-Typ und jede Zeile enthält Ihre Daten. Verzetteln Sie sich nicht in der Zeilen-Reihenfolge, denn es spielt keine Rolle und Sie können es sowieso nicht kontrollieren. Es hilft häufig, die Datenbank als eine Sammlung von vernünftig organisierten Daten-Töpfen zu betrachten. In diese fügen Sie präzise Abfragen ein, um genau die Daten zu erhalten, die Sie gerne hätten. Es sind die Abfragen, die spezifisch und gut geordnet sein müssen und nicht Ihre Tabellenzeilen. Der INSERT-Ausdruck fügt Daten in Ihre Tabellen-Zeilen, wie folgt ein:

testdb=# INSERT INTO comics VALUES ('Fabulous Furry Freak Brothers 1', 'Rip Off Press', '1971-03-15'); INSERT 0 1

Sie müssen Ihre Daten in der richtigen Zeilenreihenfolge eingeben. Wenn Sie sich nicht mehr an die Reihenfolge erinnern, gibt es zwei Möglichkeiten für Sie: Entweder Sie lesen es in der Tabellen-Struktur:

testdb=# \d comics Table "public.comics"

Column

Type

Modifiers

name

character varying(80)

publisher

character varying(80)

date_published

date

Oder Sie listen Ihre Spalten in beliebiger Reihenfolge mit Ihrem INSERT-Kommando auf. Anschließend listen Sie Ihre Werte in der gleichen Reihenfolge auf:

testdb=# INSERT INTO comics (date_published, publisher, name) VALUES('1971-03-15', 'Rip Off Press', 'Fabulous Furry Freak Brothers 1');

Hat es funktioniert? Lassen Sie es uns überprüfen:

testdb=# SELECT * from comics;

name

publisher

date_published

Fabulous Furry Freak Brothers 1

Rip Off Press

1971-03-15

(1 row)

Es hat funktioniert.

Was ist, wenn Sie viele Daten einzufügen haben? Eine schnelle Möglichkeit ist, diese Daten als reine Text-Datei einzufügen, wobei pro Datensatz eine Zeile verwendet wird. Die Spaltenreihenfolge muss beachtet werden. Jedes einzelne Feld wird über einen Tabulatorschritt geteilt. Sie sollten sicher stellen, dass keine weiteren Zeilen hinter Ihrer letzten Zeile beschrieben wurden, ansonsten gibt psql Ihnen einen „missing data"-Fehler aus, der sich auf die leeren Zeilen bezieht. Diese Beispiel-Textdatei freakbros.txt enthält zwei Daten-Zeilen:

Fabulous Furry Freak Brothers 2 Rip Off Press 1973-04-19 Fabulous Furry Freak Brothers 3 Rip Off Press 1973-12-03

Sie können Ihre Tabelle mit dem folgenden Befehl mit den Daten der Datei befüllen:

testdb=# \copy comics FROM '/home/carla/Documents/postgres/freakbros.txt'

Hier gibt es mehrere wichtige Dinge zu erläutern. Es gibt zwei Kopier-Befehle: einen SQL COPY-Befehl und ein psql \copy Kommando. Wenn Sie COPY verwenden, muss der postgres-Nutzer eine Lese-Genehmigung für die Text-Datei besitzen. Wenn Sie den \copy-Befehl verwenden, muss der System-Nutzer, der in psql eingeloggt ist, eine Lese-Erlaubnis für diese Datei haben. Beispielsweise kann der „clara"-Nutzer eine Text-Datei aus seinem Heim-Verzeichnis importieren.

Der COPY-Befehl ist schneller, weil er auf dem Server ausgeführt wird. Der \copy-Befehl wird stattdessen von dem psql-Client auf dem Server gestartet. Wenn der COPY-Befehl erfolgreich ist, wird Ihnen eine Mitteilung gesendet mit der Information, wie viele Reihen kopiert wurden. Des Weiteren erspart es einem einiges an Ärger, weil Sie Skripte ausführen lassen können, ohne sich über den Ursprung Ihrer Daten-Dateien sorgen zu müssen.

\copy erfordert kein Beendigungs-Semikolon, während COPY dies benötigt. Sie können es sich sogar aussuchen ein anderes Begrenzungszeichen an Stelle von Tabs zu verwenden, wie beispielsweise ein Komma oder einen senkrechten Strich. Stellen Sie sicher, dass auf keiner der beiden Seiten des Trenners ein Leerzeichen vorhanden ist, anschließend spezifizieren Sie Ihr Trennzeichen wie in diesem Beispiel:

testdb=# COPY comics FROM '/etc/postgresql/9.0/main/freakbros.txt' USING DELIMITERS ',';

Häufig ist es sehr verwirrend herauszufinden, wie die Datei-Erlaubnis funktioniert. SELinux kann Ihnen übrigens in die Quere kommen und noch ein paar Anpassungen benötigen. Der einfachste Weg, den wir gefunden haben, um Dateien den postgres-Nutzern zugänglich zu machen, ist ein spezielles Verzeichnis, das dem Postgres-Benutzer und der Gruppe gehört. Anschließend bestimmen Sie, dass alle Dateien darin postgres gehören. Oder Sie verwenden ein Verzeichnis, dass bereits postgres gehört. Beispielsweise gehört auf unserem Debian-Test-System /etc/postgresql/9.0/ bereits postgres, sodass wir unser Dateien dort lagern. Verwenden Sie das find-Kommando, um schnell herauszufinden, welche Dateien und Verzeichnisse zu postgres gehören. Das folgende Beispiel durchsucht das gesamte Datei-Systems außer dem /proc - pseudo-Verzeichnis und den Netzwerk-Anteilen:

# find / -xdev \( -name proc -prune \) -o -user postgres

Export der Tabellen-Daten

Es macht Spaß Daten in eine PostgreSQL-Tabelle einzufügen und Sie können diese sogar sehr einfach mit dem COPY und \copy-Befehlen exportieren. Auch hier benötigt COPY ein Beendigungs-Semikolon und ein Ausgangsverzeichnis, das der postgres-Nutzer beschreiben darf. \copy hat kein beendendes Semikolon und der Output muss in das Benutzer-Verzeichnis eines eingewählten psql-Nutzers führen. Hier sind Beispiele für beide Ansätze:

testdb=# COPY comics TO '/etc/postgresql/9.0/main/freakout.txt'; testdb=# \copy comics TO '/home/carla/freakout1.txt'

Sie können jede der COPY und \copy-Befehls-Optionen für den Export verwenden, wie Sie es von der Integration in die Tabelle gewohnt sind. Sie können auch hier die Abstandshalter selbst definieren.

Sie können unterschiedliche Kommandos, wie beispielsweise Aktualisierungen, Löschungen, oder wie Nullen gehandhabt werden ausprobieren. Jetzt wollen wir abschließend einen kurzen Blick auf die wichtigen Schlüsselbegriffe werfen.

PC-WELT Marktplatz

0 Kommentare zu diesem Artikel
1153282