Herramienta de línea de comandos de psql

psql es el frontend de línea de comandos de PostgreSQL. En esta página, se describe psql comandos que admite la interfaz de PostgreSQL para Spanner. Para aprender a hacer lo siguiente: conectar con psql, ver Conecta psql a una base de datos de dialectos de PostgreSQL.

Metacomandos

La interfaz de PostgreSQL admite las siguientes categorías de metacomandos psql:

  • General
  • Ayuda
  • Búfer 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 Enumerar tablas (excepto las tablas del sistema)
\d table Enumerar columnas de la tabla
\dt Enumerar tablas en todos los esquemas (detallado)
\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 conductor admite las declaraciones de administración de sesiones descritas en Declaraciones de administración de sesiones. Por lo tanto, puedes usar estas sentencias con psql.

Agrupación en lotes de las instrucción de SQL

psql y PGAdapter admiten lotes de SQL de varias sentencias. Para organizar las sentencias por lotes, usa la opción psql -c. Esta opción permite uno o más SQL o la administración de sesiones. separadas por punto y coma (;), que se pasarán como una sola solicitud de ejecución. Un lote puede incluir cualquier declaración compatible y puede combinar DDL, DML y DQL.

Un lote con varias sentencias se ejecuta dentro de un único bloque de transacciones implícitas. Los bloques de transacciones implícitas se cierran automáticamente al final del lote. Si se produce algún error dentro de un bloque de transacciones implícito, toda la se revierta la transacción.

BEGIN y Se admiten controles de transacciones de COMMIT, pero hay un bloqueo explícito de transacciones y no puede incluir declaraciones DDL.

Ejemplos

DML

En el siguiente ejemplo, se muestra cómo enviar un lote de declaraciones 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 de 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 declaraciones 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 dialectos de PostgreSQL. Aunque solo se admite STDIN, puedes realizar importaciones con COPY. canalizando los archivos a psql.

Hay dos maneras de ejecutar el comando COPY:

  • COPY atómico

    Los datos se copian en una sola transacción. Esta es la opción predeterminada. Límites de transacciones estándar de Spanner se aplica a la transacción. Esto significa que, como máximo, Se pueden incluir 80,000 mutaciones o 100 MB de datos en una operación COPY.

  • COPY no atómico

    COPY divide automáticamente los datos en múltiples transacciones si el archivo contiene más de 80,000 mutaciones o más a más de 100 MB.

    Si se produce un error durante COPY y se anula 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 la importación el archivo que causó el error podría importarse a la base de datos antes se detiene la operación COPY.

Habilitar COPY no atómico

Para habilitar COPY no atómico, envía el siguiente comando antes de ejecutar la copia una sola operación.

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 copian todas las columnas de la tabla.

El valor predeterminado para 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 string vacía sin comillas en formato CSV. Es posible que prefieras una cadena vacía, incluso en formato de texto, para los casos en los que no quieras distinguir valores nulos de cadenas vacías.

QUOTE especifica el carácter de comillas que se debe usar cuando se cita un valor de datos. El valor predeterminado es comillas dobles. Debe ser un carácter de un solo byte. Esta opción solo se permite cuando se usa el formato CSV.

ESCAPE especifica el carácter que debe aparecer antes de un carácter de datos que coincide con el valor QUOTE. El valor predeterminado es el mismo que el valor QUOTE (de modo que el carácter entrecomillado se duplica si aparece en los datos). Debe ser un carácter de un solo 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 columna 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 se produce cuando una fila en el archivo de entrada no incluye un valor (o un valor nulo). para cada columna de la tabla. Una causa podría ser un archivo CSV con errores de formato o una discrepancia entre la opción de delimitador especificado (o delimitador predeterminado) y el delimitador real en el archivo.

¿Qué sigue?