ChatGPT解决这个技术问题 Extra ChatGPT

Run a PostgreSQL .sql file using command line arguments

I have some .sql files with thousands of INSERT statements in them and need to run these inserts on my PostgreSQL database in order to add them to a table. The files are that large that it is impossible to open them and copy the INSERT statements into an editor window and run them there. I found on the Internet that you can use the following by navigating to the bin folder of your PostgreSQL install:

psql -d myDataBase -a -f myInsertFile

In my case:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

I am then asked for a password for my user, but I cannot enter anything and when I hit enter I get this error:

psql: FATAL: password authentication failed for user "myUsername"

Why won't it let me enter a password. Is there a way round this as it is critical that I can run these scripts?

I got around this issue by adding a new entry in my pg_hba.conf file with the following structure:

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

The pg_hba.conf file can usually be found in the 'data' folder of your PostgreSQL install.

You've already had your answer but just in case... "I cannot enter anything", might you be talking about the fact that typing your password doesn't show anything? That's normal in this case, normally typing the password and hitting Enter should work...
I had a similar problem installing a copy of ITIS (itis.gov). The database didn't exist, so I couldn't use its name. Because of the way PostgreSQL works, I could do this: psql --port=5554 --username=root --file=ITIS.sql template1

Y
Yash Sharma

Of course, you will get a fatal error for authenticating, because you do not include a user name...

Try this one, it is OK for me :)

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

If the database is remote, use the same command with host

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

Note that the provided username has to be a valid postgres role. The default is the currently logged in user.
Why the -a param?
@AlikElzin-kilaka -a is not needed here. It's "Print all nonempty input lines to standard output as they are read"
P
Peter Mortensen

You should do it like this:

\i path_to_sql_file

See:

https://i.stack.imgur.com/oLP8E.png


I get Permission denied
after doing chmod 777 myfile error Permission denied was fixed
@Zac if your Permission denied happened on a windows machine, you might be using the wrong slashes.
I had this error on windows and it turned out to be the slashes, as @pgsandstrom mentioned. Wrong slashes = use forward slashes instead, and no quote on path. \i c:/dev/script.sql
P
Peter Mortensen

You have four choices to supply a password:

Set the PGPASSWORD environment variable. For details see the manual: http://www.postgresql.org/docs/current/static/libpq-envars.html Use a .pgpass file to store the password. For details see the manual: http://www.postgresql.org/docs/current/static/libpq-pgpass.html Use "trust authentication" for that specific user: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST Since PostgreSQL 9.1 you can also use a connection string: https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING


Hi. I have now set the settings to trust but I notice that the software is trying to use my windows username in order to login. I want to use a role that I have setup in my Postgresql database. Is there a way of telling it which role to use to run the command?
@CSharpened: use the -u parameter as documented in the manual
#2 is extremely simple. Just add one line containing host:port:db:user:pass to a file and you're done. Nice work.
c
cegas

Use this to execute *.sql files when the PostgreSQL server is located in a difference place:

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

Then you are prompted to enter the password of the user.

EDIT: updated based on the comment provided by @zwacky


@ChickenWing24 -a: all echo, -q: quiet, -f: file
does this work without database? I'm trying to create new database using this tool into existing server.
F
Florian

If you are logged in into psql on the Linux shell the command is:

\i fileName.sql

for an absolute path and

\ir filename.sql

for the relative path from where you have called psql.


As @Florian says, once logged in you can execute a file. Remember to mark any comment lines in your SQL as either of two ways ...-- comment to end of line a) -- one line comment OR b) /* multiple line comments */
Wow, thank you very much, it ran very well.
A
Alban
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql

how can I do that without output
psql -h -d -U -p -a -q -w -f .sql
@Lu32 You could also leave out the flag -a (which means "Print all nonempty input lines to standard output as they are read"). EDIT tested, without -a it prints out less, but still too much information. So the -q flag is correct, as vishu9219 said.
P
Peter Mortensen

Via the terminal log on to your database and try this:

database-# >@pathof_mysqlfile.sql

or

database-#>-i pathof_mysqlfile.sql

or

database-#>-c pathof_mysqlfile.sql

this solution is more solid as for me; not the one marked as answe
D
Deepu Sahni

You can give both user name and PASSSWORD on the command line itself.

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

This works if you don't want to set environment variables or use strange pass files. =)
this should have been the accepted answer, thank you
R
Ravinder Reddy

you could even do it in this way:

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

If you have sudo access on machine and it's not recommended for production scripts just for test on your own machine it's the easiest way.


P
Peter Mortensen

Walk through on how to run an SQL on the command line for PostgreSQL in Linux:

Open a terminal and make sure you can run the psql command:

psql --version
which psql

Mine is version 9.1.6 located in /bin/psql.

Create a plain textfile called mysqlfile.sql

Edit that file, put a single line in there:

select * from mytable;

Run this command on commandline (substituting your username and the name of your database for pgadmin and kurz_prod):

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

The following is the result I get on the terminal (I am not prompted for a password):

select * from mytable;

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

(2 rows)

How do you set up a user? It's my first time installing and running -f on a new .sql file. Always says wrong password
w
wingman__7

2021 Solution

if your PostgreSQL database is on your system locally.

psql dbname < sqldump.sql username

If its hosted online

psql -h hostname dbname < sqldump.sql username

If you have any doubts or questions, please ask them in the comments.


is it OS dependent?
@BingLi224 I use a Windows System and I'm pretty sure that it's not OS dependent.
Best answer. Applicable to Ubuntu/Debian systems. If you run it from a user with the permission to alter the database, you can even omit the username part, so it's just psql dbname < sqldump.sql.
@Neurotransmitter true, that will work as well.
b
blurfus
psql -h localhost -d userstoreis -U admin -p 5432 -a -q -f /home/jobs/Desktop/resources/postgresql.sql

Parameter explanations:

-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

P
Peter Mortensen

You can open a command prompt and run as administrator. Then type

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

Password for user postgres: will show up.

Type your password and enter. I couldn't see the password what I was typing, but this time when I press enter it worked. Actually I was loading data into the database.


I think you mean -d "postgres"
@amphetamachine -d for database name , check psql --help
P
PaulShovan

I achived that wrote (located in the directory where my script is)

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

where -u user is the role who owns the database where I want to execute the script then the psql connects to the psql console after that -d my_database loads me in mydatabase finally -a -f file.sql where -a echo all input from the script and -f execute commands from file.sql into mydatabase, then exit.

I'm using: psql (PostgreSQL) 10.12 on (Ubuntu 10.12-0ubuntu0.18.04.1)


j
jmm

A small improvement in @wingman__7 's 2021 answer: if your username contains certain characters (an underscore in my case), you need to pass it with the -U flag.
This worked for me:

$ psql -h db.host -d db_name -U my_user < query.sql 

l
lemon

Try using the following command in the command line console:

psql -h localhost -U postgres -f restore.sql