psql
es el frontend de la línea de comandos para PostgreSQL. En esta página, se describen los comandos psql
que admite la interfaz de PostgreSQL para Spanner. Para aprender a conectarte con psql
, consulta Cómo conectar psql a una base de datos de dialecto de PostgreSQL.
Metacomandos
La interfaz de PostgreSQL admite las siguientes categorías de metacomandos psql
:
- General
- Ayuda
- Buffer de consulta
- Input/Output
- Condicional
- Informativo (solo algunos comandos \d)
- Formato
- Sistema operativo
- Variables
No se admiten las siguientes categorías:
- Conexión
- Objetos grandes
Se admiten los siguientes comandos informativos:
Comando | Descripción |
---|---|
\d | Tablas de lista (sin incluir las tablas del sistema) |
\d table | Enumera las columnas de la tabla |
\dt | Enumera tablas en todos los esquemas (detallada) |
\dt table | Tabla de lista (detallada) |
\dn | Enumerar esquemas |
Declaraciones de administración de sesiones
psql
se comunica con Spanner a través de PGAdapter, que usa el motor principal del controlador JDBC de Spanner. El controlador admite las declaraciones de administración de sesiones que se describen en Declaraciones de administración de sesiones.
Por lo tanto, puedes usar estas sentencias con psql
.
Procesamiento por lotes de instrucción de SQL
psql
y PGAdapter admiten lotes de SQL de varias instrucciones. Para procesar sentencias por lotes, usa
la opción psql -c
. Esta opción permite pasar una o más instrucciones de SQL o administración de sesiones, separadas por punto y coma (;), como una sola solicitud de ejecución.
Un lote puede incluir cualquier sentencia admitida y puede combinar DDL, DML y DQL.
Un lote de varias instrucciones se ejecuta dentro de un solo bloque de transacción implícito. Los bloqueos de transacciones implícitos se cierran automáticamente al final del lote. Si se producen errores dentro de un bloque de transacción implícito, se revierte toda la transacción.
Se admiten controles de transacciones BEGIN
y COMMIT
explícitos, pero un bloque de transacciones explícito no puede contener instrucciones DDL.
Ejemplos
DML
En el siguiente ejemplo, se muestra cómo enviar un lote de instrucciones INSERT
.
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');"
En el siguiente ejemplo, se muestra cómo ejecutar las instrucciones SQL en el archivo insert_contacts.sql
.
psql -h localhost -c "$(cat contacts_insert.sql)"
DDL
En este ejemplo, se envía un lote de sentencias ALTER TABLE
.
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;"
Comando COPY para importar datos
Usa el comando COPY FROM STDIN
para importar datos de un archivo de texto o CSV a una base de datos de dialecto PostgreSQL. Aunque solo se admite STDIN, puedes importar con COPY
canalizando archivos a psql
.
Existen dos maneras de ejecutar el comando COPY
:
COPY
atómicoLos datos se copian en una sola transacción. Esta es la opción predeterminada. Se aplican los límites de transacciones estándar de Spanner a la transacción. Esto significa que se pueden incluir como máximo 80,000 mutaciones o 100 MB de datos en una operación
COPY
.COPY
no atómicoCOPY
divide automáticamente los datos en varias transacciones si el archivo contiene más de 80,000 mutaciones o más de 100 MB.Si se produce un error durante
COPY
y se cancela la operación, es posible que algunas filas ya se hayan conservado en la base de datos. No se produce ninguna reversión. Las transacciones se ejecutan en paralelo, por lo que los datos después de la fila en el archivo de importación que causó el error pueden importarse a la base de datos antes de que se detenga la operaciónCOPY
.
Habilita COPY
no atómico
Para habilitar COPY
no atómico, envía el siguiente comando antes de ejecutar la operación de copia.
SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'
Sintaxis
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}
La tabla ya debe existir. Si no se especifica una lista de columnas, se copiarán todas las columnas de la tabla.
El valor predeterminado de FORMAT
es text
.
delimiter_character debe ser un carácter de un byte. El valor predeterminado es el carácter de tabulación para el formato de texto y una coma para el formato CSV.
NULL
especifica la cadena que representa un valor nulo. El valor predeterminado es \N (barra invertida + N) en formato de texto y una cadena vacía sin comillas en formato CSV. Es posible que prefieras una cadena vacía, incluso en formato de texto, en los casos en que no quieras distinguir los valores nulos de las cadenas vacías.
QUOTE
especifica el carácter de comillas que se debe usar cuando se entrecomilla un valor de datos. El valor predeterminado es comillas dobles. Debe ser un solo carácter de un byte. Esta opción solo se permite cuando se usa el formato CSV.
ESCAPE
especifica el carácter que aparecerá antes de un carácter de datos que coincida con el valor QUOTE
. El valor predeterminado es el mismo que el valor QUOTE
(para que el carácter de comillas se duplique si aparece en los datos). Debe ser un solo carácter de un byte. Esta opción solo se permite cuando se usa el formato CSV.
HEADER
indica si el primer registro del archivo de entrada es un encabezado (contiene nombres de columnas). El valor predeterminado es TRUE.
Ejemplos
En este ejemplo, se importan datos del archivo con formato de texto llamado mydata.txt
a la tabla mytable
. PGAdapter debe estar en ejecución. Para obtener más información, consulta Cómo iniciar PGAdapter.
cat mydata.txt | psql -h localhost -c "COPY mytable FROM STDIN;"
En el siguiente ejemplo, mydata.csv
está en formato CSV y su primera fila es un encabezado con nombres de columnas separados por comas.
cat mydata.csv | psql -h localhost \
-c "COPY mytable FROM STDIN WITH (FORMAT csv, ESCAPE '~', HEADER TRUE);"
En el siguiente ejemplo, se muestra cómo iniciar una operación COPY
no atómica.
cat mydata.txt | psql -h localhost \
-c "SET SPANNER.AUTOCOMMIT_DML_MODE='PARTITIONED_NON_ATOMIC'" -c "COPY mytable FROM STDIN;"
Soluciona problemas
Los siguientes son algunos errores comunes.
Sintaxis de entrada no válida
Se produce el siguiente error:
Invalid input syntax for type <type>:"<table_name>"
Este error puede ocurrir cuando el archivo de entrada tiene una fila de encabezado con nombres de columnas y no se especificó la opción HEADER
.
Datos de COPY no válidos
Se produce el siguiente error:
Invalid COPY data: Row length mismatched. Expected <number> columns, but only found <number>
Este error ocurre cuando una fila del archivo de entrada no incluye un valor (o nulo) para cada columna de la tabla. Una de las causas puede ser un archivo CSV con el formato incorrecto o una discrepancia entre la opción de delimitador especificada (o delimitador predeterminado) y el delimitador real del archivo.
¿Qué sigue?
- Obtén información para conectarte a una base de datos de dialecto de PostgreSQL con
psql
. - Obtén información sobre PGAdapter.