Ejecute un archivo .sql de PostgreSQL utilizando argumentos de línea de comando


540

Tengo algunos archivos .sql con miles de instrucciones INSERT y necesito ejecutar estos insertos en mi base de datos PostgreSQL para agregarlos a una tabla. Los archivos son tan grandes que es imposible abrirlos y copiar las instrucciones INSERT en una ventana del editor y ejecutarlas allí. Descubrí en Internet que puede usar lo siguiente navegando a la carpeta bin de su instalación de PostgreSQL:

psql -d myDataBase -a -f myInsertFile

En mi caso:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

Luego me piden una contraseña para mi usuario, pero no puedo ingresar nada y cuando presiono enter recibo este error:

psql: FATAL: la autenticación de contraseña falló para el usuario "myUsername"

¿Por qué no me deja ingresar una contraseña? ¿Hay alguna forma de evitar esto, ya que es fundamental que pueda ejecutar estos scripts?

Resolví este problema agregando una nueva entrada en mi archivo pg_hba.conf con la siguiente estructura:

# IPv6 local connections:
host    myDbName    myUserName ::1/128    trust

El archivo pg_hba.conf generalmente se puede encontrar en la carpeta 'data' de su instalación de PostgreSQL.


66
Ya ha recibido su respuesta, pero por si acaso ... "No puedo ingresar nada", ¿podría estar hablando del hecho de que escribir su contraseña no muestra nada? Eso es normal en este caso, normalmente escribir la contraseña y presionar Enter debería funcionar ...
Évelyne Lachance

Tuve un problema similar al instalar una copia de ITIS ( itis.gov ). La base de datos no existía, así que no pude usar su nombre. Debido a la forma en que funciona PostgreSQL, podría hacer esto: psql --port = 5554 --username = root --file = ITIS.sql template1
Cyberknight

Respuestas:


157

Tiene cuatro opciones para proporcionar una contraseña:

  1. Establezca la variable de entorno PGPASSWORD. Para más detalles vea el manual:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. Use un archivo .pgpass para almacenar la contraseña. Para más detalles vea el manual:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. Use "autenticación de confianza" para ese usuario específico: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. Desde PostgreSQL 9.1 también puede usar una cadena de conexión :
    https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING

Hola. Ahora configuré los ajustes para que confíen, pero noté que el software está intentando usar mi nombre de usuario de Windows para iniciar sesión. Quiero usar un rol que configuré en mi base de datos Postgresql. ¿Hay alguna manera de decirle qué rol usar para ejecutar el comando?
CSharpened

2
@CSharpened: use el -uparámetro como se documenta en el manual
a_horse_with_no_name

# 2 es extremadamente simple. Simplemente agregue una línea que contenga host: puerto: db: usuario: pase a un archivo y listo. Buen trabajo.
Kriil

494

Por supuesto, obtendrá un error fatal para la autenticación, porque no incluye un nombre de usuario ...

Prueba este, está bien para mí :)

psql -U username -d myDataBase -a -f myInsertFile

Si la base de datos es remota, use el mismo comando con el host

psql -h host -U username -d myDataBase -a -f myInsertFile

44
Tenga en cuenta que el nombre de usuario proporcionado debe ser un rol válido de postgres. El valor predeterminado es el usuario actualmente conectado.
matthias krull

8
¿Por qué el -aparam?
AlikElzin-kilaka

55
@ AlikElzin-kilaka -ano es necesario aquí. Es "Imprimir todas las líneas de entrada no vacías a la salida estándar a medida que se leen"
mjspier

Esta debería ser la respuesta aceptada.
Kostanos

316

Deberías hacerlo así:

\i path_to_sql_file

Ver:

Ingrese la descripción de la imagen aquí


2
Me salePermission denied
Zac

44
después de hacer el chmod 777 myfileerror Permission deniedfue corregido
Ulug'bek Ro'zimboyev

55
@Zac si su permiso denegado sucedió en una máquina con Windows, es posible que esté utilizando las barras diagonales incorrectas.
pgsandstrom

2
Tuve este error en Windows y resultó ser las barras, como mencionó @pgsandstrom. Barras incorrectas = utilice barras diagonales en su lugar, y sin comillas en la ruta. \ ic: /dev/script.sql
Dave

51

Use esto para ejecutar archivos * .sql cuando el servidor PostgreSQL se encuentre en un lugar diferente:

psql -h localhost -d userstoreis -U admin -p 5432 -a -q -f /home/jobs/Desktop/resources/postgresql.sql

-h PostgreSQL server IP address
-d database name
-U user name
-p port which PostgreSQL server is listening on
-f path to SQL script
-a all echo
-q quiet

Luego se le solicita que ingrese la contraseña del usuario.

EDITAR: actualizado en base al comentario proporcionado por @zwacky


55
@ ChickenWing24 -a: all echo ,: -qquiet -f
,:

Este resolvió mi propio problema, genial
Temi 'Topsy' Bello

45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql

1
¿Cómo puedo hacer eso sin salida
Lu32

2
psql -h <host> -d <database> -U <user_name> -p <port> -a -q -w -f <file> .sql
vishu9219

3
@ Lu32 También puede omitir el indicador -a (que significa "Imprimir todas las líneas de entrada no vacías en la salida estándar a medida que se leen"). EDITADO probado, sin -a imprime menos, pero aún demasiada información. Entonces la bandera -q es correcta, como dijo vishu9219.
Rauni Lillemets

41

Si ha iniciado sesión en psql en el shell de Linux, el comando es:

\i fileName.sql

para un camino absoluto y

\ir filename.sql

para la ruta relativa desde donde ha llamado psql.


Como dice @Florian, una vez que haya iniciado sesión puede ejecutar un archivo. Recuerde marcar cualquier línea de comentario en su SQL como de dos maneras ...-- comentario al final de la línea a) - comentario de una línea O b) / * comentarios de varias líneas * /
Suma S

26

A través del terminal, inicie sesión en su base de datos e intente esto:

database-# >@pathof_mysqlfile.sql

o

database-#>-i pathof_mysqlfile.sql

o

database-#>-c pathof_mysqlfile.sql

esta solución es más sólida para mí; no el marcado como respuesta
AlexG

17

Puede proporcionar tanto el nombre de usuario como la CONTRASEÑA en la línea de comando.

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql

Esto funciona si no desea establecer variables de entorno o utilizar archivos de paso extraños. =)
Martin

esta debería haber sido la respuesta aceptada, gracias
grepit

13

incluso podrías hacerlo de esta manera:

sudo -u postgres psql -d myDataBase -a -f myInsertFile

Si tiene sudoacceso en la máquina y no se recomienda para scripts de producción solo para probar en su propia máquina, es la forma más fácil.


9

Vea cómo ejecutar un SQL en la línea de comando para PostgreSQL en Linux:

Abra una terminal y asegúrese de poder ejecutar el psqlcomando:

psql --version
which psql

La mía es la versión 9.1.6 ubicada en /bin/psql .

Cree un archivo de texto simple llamado mysqlfile.sql

Edite ese archivo, ponga una sola línea allí:

select * from mytable;

Ejecute este comando en la línea de comandos (sustituyendo su nombre de usuario y el nombre de su base de datos por pgadmin y kurz_prod):

psql -U pgadmin -d kurz_prod -a -f mysqlfile.sql

El siguiente es el resultado que obtengo en el terminal (no se me solicita una contraseña):

select * from mytable;

test1
--------
hi
me too

(2 rows)

¿Cómo se configura un usuario? Es la primera vez que instalo y ejecuto -f en un nuevo archivo .sql. Siempre dice una contraseña incorrecta
mKane

4

Puede abrir un símbolo del sistema y ejecutar como administrador. Luego escribe

../bin>psql -f c:/...-h localhost -p 5432 -d databasename -U "postgres"

Password for user postgres: Aparecerá.

Escriba su contraseña e ingrese. No pude ver la contraseña que estaba escribiendo, pero esta vez cuando presioné enter funcionó. En realidad estaba cargando datos en la base de datos.


Creo que te refieres-d "postgres"
amphetamachine

@amphetamachine -d para el nombre de la base de datos, verifiquepsql --help
Yaz

1

Logré que escribió (ubicado en el directorio donde está mi script)

::someguy@host::$sudo -u user psql -d my_database -a -f file.sql 

donde -u user es el rol propietario de la base de datos donde quiero ejecutar el script, luego se psqlconecta a la psqlconsola y luego -d my_databaseme carga mydatabasefinalmente -a -f file.sqldonde -aecho toda la entrada del script y -fejecuta los comandos desde file.sqladentro mydatabase, luego salgo.

Estoy usando: psql (PostgreSQL) 10.12 en (Ubuntu 10.12-0ubuntu0.18.04.1)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.