psql
ist das Befehlszeilen-Front-End für PostgreSQL. Auf dieser Seite wird psql
beschrieben.
Befehle, die von der PostgreSQL-Schnittstelle für Spanner unterstützt werden. Wenn Sie mehr darüber erfahren möchten, wie Sie
verbinden mit psql
siehe
psql mit einer PostgreSQL-Dialect-Datenbank verbinden
Meta-Befehle
Die PostgreSQL-Schnittstelle unterstützt die folgenden psql
-Metabefehlskategorien:
- Allgemein
- Hilfe
- Abfragezwischenspeicher
- Ein-/Ausgang
- Bedingt
- Zur Information (nur einige \d-Befehle)
- Formatierung
- Betriebssystem
- Variablen
Die folgenden Kategorien werden nicht unterstützt:
- Verbindung
- Große Objekte
Die folgenden Befehle zur Information werden unterstützt:
Befehl | Beschreibung |
---|---|
\d | Tabellen auflisten (mit Ausnahme von Systemtabellen) |
\d table | Tabellenspalten auflisten |
\dt | Tabellen in allen Schemas auflisten (detailliert) |
\dt table | Tabelle auflisten (detailliert) |
\dn | Schemas auflisten |
Anweisungen zur Sitzungsverwaltung
psql
kommuniziert mit Spanner über PGAdapter.
das die Kern-Engine des Spanner-JDBC-Treibers nutzt. Der Fahrer
die in diesem Dokument
Anweisungen zur Sitzungsverwaltung:
Daher können Sie diese Anweisungen mit psql
verwenden.
Batchverarbeitung von SQL-Anweisung
psql
und PGAdapter unterstützen SQL-Batches mit mehreren Anweisungen. Für Batch-Anweisungen verwenden Sie
die Option psql -c
. Diese Option ermöglicht eine oder mehrere SQL- oder Sitzungsverwaltung
Anweisungen, getrennt durch Semikolons (;), die als einzelne Ausführungsanfrage übergeben werden sollen.
Ein Batch kann beliebige unterstützte Anweisungen enthalten und DDL, DML und DQL mischen.
Ein Batch mit mehreren Anweisungen wird in einem einzelnen impliziten Transaktionsblock ausgeführt. Implizite Transaktionsblocks werden am Ende des Batches automatisch geschlossen. Wenn innerhalb eines impliziten Transaktionsblocks Fehler auftreten, Transaktion wird zurückgesetzt.
Explizite BEGIN
und
COMMIT
-Transaktionssteuerelemente werden unterstützt, aber eine explizite Transaktionsblockierung
darf keine DDL-Anweisungen enthalten.
Beispiele
DML
Das folgende Beispiel zeigt, wie ein Batch von INSERT
-Anweisungen gesendet wird.
psql -h localhost -p 5432 -c "INSERT INTO users (id, age, firstname) VALUES (1, 25, 'Alex'); \
INSERT INTO users (id, age, firstname) VALUES (2, 31, 'Dana'); \
INSERT INTO users (id, age, firstname) VALUES (3, 54, 'Izumi');"
Das nächste Beispiel zeigt, wie die SQL-Anweisungen in der Datei insert_contacts.sql
ausgeführt werden.
psql -h localhost -c "$(cat contacts_insert.sql)"
DDL
In diesem Beispiel wird ein Batch von ALTER TABLE
-Anweisungen gesendet.
psql -h localhost -p 5432 test-db -c "ALTER TABLE users ADD col1 integer; \
ALTER TABLE users ADD col2 text; ALTER TABLE users ADD col3 float8;"
COPY-Befehl zum Importieren von Daten
Verwenden Sie den Befehl COPY FROM STDIN
, um Daten aus einer Text- oder CSV-Datei in
eine PostgreSQL-Dialekt-Datenbank. Obwohl nur STDIN unterstützt wird, kann der Import mit COPY
durchgeführt werden.
indem Sie Dateien an psql
weiterleiten.
Es gibt zwei Möglichkeiten, den Befehl COPY
auszuführen:
Atomar
COPY
Die Daten werden in einer einzelnen Transaktion kopiert. Das ist die Standardeinstellung. Standardmäßige Transaktionslimits von Spanner auf die Transaktion angewendet wird. Das bedeutet, dass höchstens In einem
COPY
-Vorgang können 80.000 Mutationen oder 100 MB Daten enthalten sein.Nicht atomar
COPY
COPY
teilt die Daten automatisch auf mehrere Transaktionen,wenn die Datei mehr als 80.000 Mutationen oder mehr enthält als 100 MB.Wenn während des
COPY
ein Fehler auftritt und der Vorgang abgebrochen wird, sind einige Zeilen möglicherweise bereits in der Datenbank gespeichert. Es erfolgt kein Rollback. Die Transaktionen werden parallel ausgeführt, damit Daten nach der Zeile im Import Datei, die den Fehler verursacht hat, wird möglicherweise vor dem Der VorgangCOPY
wurde angehalten.
Nicht atomaren COPY
aktivieren
Senden Sie den folgenden Befehl, bevor Sie die Kopie ausführen, um das nicht atomarische COPY
zu aktivieren
.
SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'
Syntax
COPY table_name [ ( column_name [, ...] ) ] FROM STDIN [ [ WITH ] ( option [, ...] ) ] where option is one of: FORMAT format_name DELIMITER 'delimiter_character' NULL 'null_string' QUOTE 'quote_character' ESCAPE 'escape_character' HEADER [boolean] and format_name is: {text|csv} and delimiter_character is: [!-~] except ' " \ and null_string is: {a—z|A—Z|0—9|_}+ and quote_character is: [!-~] except ' " \ and escape_character is: [!-~] except ' " \ and boolean is: {TRUE|ON|1|FALSE|OFF|0}
Die Tabelle muss bereits vorhanden sein. Wenn keine Spaltenliste angegeben ist, werden alle Spalten der Tabelle kopiert.
Der Standardwert für FORMAT
ist text
.
delimiter_character muss ein Ein-Byte-Zeichen sein. Standardmäßig wird im Textformat das Tabulatorzeichen und im CSV-Format ein Komma verwendet.
NULL
gibt den String an, der einen Nullwert darstellt. Der Standardwert ist \N (umgekehrter Schrägstrich + N) im Textformat und ein leerer String ohne Anführungszeichen im CSV-Format. Möglicherweise bevorzugen Sie einen leeren String auch im Textformat, wenn Sie NULL-Werte nicht von leeren Strings unterscheiden möchten.
QUOTE
gibt das Anführungszeichen an, das bei Anführungszeichen eines Datenwerts verwendet werden soll. Standardmäßig werden doppelte Anführungszeichen verwendet. Dies muss ein einzelnes 1-Byte-Zeichen sein. Diese Option ist nur im CSV-Format zulässig.
ESCAPE
gibt das Zeichen an, das vor einem Datenzeichen stehen soll, das mit dem Wert QUOTE
übereinstimmt. Der Standardwert entspricht dem Wert QUOTE
, d. h., das Anführungszeichen wird verdoppelt, wenn es in den Daten enthalten ist. Dies muss ein einzelnes 1-Byte-Zeichen sein. Diese Option ist nur im CSV-Format zulässig.
HEADER
gibt an, ob der erste Datensatz der Eingabedatei ein Header ist (enthält Spaltennamen). Der Standardwert ist TRUE.
Beispiele
In diesem Beispiel werden Daten aus der Textdatei namens mydata.txt
in die Tabelle mytable
importiert. PGAdapter
ausgeführt werden muss. Weitere Informationen finden Sie unter PGAdapter starten.
cat mydata.txt | psql -h localhost -c "COPY mytable FROM STDIN;"
Im nächsten Beispiel liegt mydata.csv
im CSV-Format vor und die erste Zeile ist eine Kopfzeile mit
kommagetrennte Spaltennamen festlegen.
cat mydata.csv | psql -h localhost \
-c "COPY mytable FROM STDIN WITH (FORMAT csv, ESCAPE '~', HEADER TRUE);"
Im nächsten Beispiel wird gezeigt, wie Sie einen nicht atomaren COPY
-Vorgang starten.
cat mydata.txt | psql -h localhost \
-c "SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'" -c "COPY mytable FROM STDIN;"
Fehlerbehebung
Im Folgenden sind einige häufige Fehler aufgeführt.
Ungültige Eingabesyntax
Folgender Fehler tritt auf:
Invalid input syntax for type <type>:"<table_name>"
Dieser Fehler kann auftreten, wenn die Eingabedatei eine Kopfzeile mit Spaltennamen und
Die Option HEADER
wurde nicht angegeben.
Ungültige COPY-Daten
Folgender Fehler tritt auf:
Invalid COPY data: Row length mismatched. Expected <number> columns, but only found <number>
Dieser Fehler tritt auf, wenn eine Zeile in der Eingabedatei keinen Wert (oder null) enthält. für jede Spalte in der Tabelle. Eine Ursache könnte eine fehlerhafte CSV-Datei oder eine Abweichung sein zwischen der angegebenen Trennzeichenoption (oder dem Standardtrennzeichen) und dem tatsächlichen Trennzeichen in der Datei.