Jalankan file .sql PostgreSQL menggunakan argumen baris perintah

540

Saya memiliki beberapa file .sql dengan ribuan pernyataan INSERT di dalamnya dan perlu menjalankan sisipan ini pada database PostgreSQL saya untuk menambahkannya ke tabel. File-file itu besar sehingga tidak mungkin untuk membukanya dan menyalin pernyataan INSERT ke jendela editor dan menjalankannya di sana. Saya menemukan di Internet bahwa Anda dapat menggunakan yang berikut dengan menavigasi ke folder bin dari instalasi PostgreSQL Anda:

psql -d myDataBase -a -f myInsertFile

Dalam hal ini:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

Saya kemudian dimintai kata sandi untuk pengguna saya, tetapi saya tidak bisa memasukkan apa pun dan ketika saya menekan enter saya mendapatkan kesalahan ini:

psql: FATAL: otentikasi kata sandi gagal untuk "myUsername" pengguna

Mengapa tidak membiarkan saya memasukkan kata sandi. Apakah ada jalan keluarnya karena sangat penting untuk menjalankan skrip ini?

Saya mengatasi masalah ini dengan menambahkan entri baru di file pg_hba.conf saya dengan struktur berikut:

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

File pg_hba.conf biasanya dapat ditemukan di folder 'data' dari instalasi PostgreSQL Anda.

CSharpened
sumber
6
Anda sudah memiliki jawaban tetapi untuk berjaga-jaga ... "Saya tidak bisa memasukkan apa pun", mungkinkah Anda berbicara tentang fakta bahwa mengetik kata sandi tidak menunjukkan apa-apa? Itu normal dalam hal ini, biasanya mengetikkan kata sandi dan menekan Enter harus bekerja ...
Évelyne Lachance
Saya memiliki masalah yang serupa menginstal salinan ITIS ( itis.gov ). Basis data tidak ada, jadi saya tidak bisa menggunakan namanya. Karena cara kerja PostgreSQL, saya bisa melakukan ini: psql --port = 5554 --username = root --file = ITIS.sql template1
Cyberknight

Jawaban:

157

Anda memiliki empat pilihan untuk memberikan kata sandi:

  1. Setel variabel lingkungan PGPASSWORD. Untuk detailnya lihat manual:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. Gunakan file .pgpass untuk menyimpan kata sandi. Untuk detailnya lihat manual:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. Gunakan "trust trust" untuk pengguna tertentu: http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. Sejak PostgreSQL 9.1 Anda juga dapat menggunakan string koneksi :
    https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
seekor kuda tanpa nama
sumber
Hai. Saya sekarang telah mengatur pengaturan untuk mempercayai tetapi saya perhatikan bahwa perangkat lunak sedang mencoba untuk menggunakan nama pengguna windows saya untuk login. Saya ingin menggunakan peran yang telah saya siapkan di basis data Postgresql saya. Apakah ada cara untuk mengatakannya peran mana yang digunakan untuk menjalankan perintah?
CSharpened
2
@CSharpened: gunakan -uparameter seperti yang didokumentasikan dalam manual
a_horse_with_no_name
# 2 sangat sederhana. Cukup tambahkan satu baris yang berisi host: port: db: user: teruskan ke file dan Anda selesai. Kerja bagus.
Kriil
494

Tentu saja, Anda akan mendapatkan kesalahan fatal untuk otentikasi, karena Anda tidak memasukkan nama pengguna ...

Coba yang ini, tidak masalah buat saya :)

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

Jika database jauh, gunakan perintah yang sama dengan host

psql -h host -U username -d myDataBase -a -f myInsertFile
pmverma
sumber
4
Perhatikan bahwa nama pengguna yang disediakan haruslah peran postgres yang valid. Defaultnya adalah pengguna yang saat ini masuk.
matthias krull
8
Kenapa -aparam?
AlikElzin-kilaka
5
@ AlikElzin-kilaka -atidak diperlukan di sini. Ini "Cetak semua jalur input non-kosong ke output standar saat dibaca"
mjspier
Ini harus menjadi jawaban yang diterima.
Kostanos
316

Anda harus melakukannya seperti ini:

\i path_to_sql_file

Lihat:

Masukkan deskripsi gambar di sini

Rachid O
sumber
2
Saya mendapatkanPermission denied
Zac
4
setelah melakukan chmod 777 myfilekesalahan Permission denieddiperbaiki
Ulug'bek Ro'zimboyev
5
@Zac jika Izin Anda ditolak terjadi pada mesin windows, Anda mungkin menggunakan garis miring yang salah.
pgsandstrom
2
Saya memiliki kesalahan ini di windows dan ternyata merupakan garis miring, seperti yang disebutkan @pgsandstrom. Garis miring salah = gunakan garis miring maju, dan tidak ada kutipan di jalur. \ ic: /dev/script.sql
Dave
51

Gunakan ini untuk mengeksekusi file * .sql ketika server PostgreSQL terletak di tempat yang berbeda:

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

Kemudian Anda diminta untuk memasukkan kata sandi pengguna.

EDIT: diperbarui berdasarkan komentar yang diberikan oleh @zwacky

GPrathap
sumber
5
@ ChickenWing24 -a: semua gema ,: -qtenang -f
,:
Yang ini menyelesaikan masalah saya sendiri, bagus
Temi 'Topsy' Bello
45
export PGPASSWORD=<password>
psql -h <host> -d <database> -U <user_name> -p <port> -a -w -f <file>.sql
vishu9219
sumber
1
bagaimana saya bisa melakukan itu tanpa output
Lu32
2
psql -h <host> -d <database> -U <user_name> -p <port> -a -q -w -f <file>
.sql
3
@ Lu32 Anda juga dapat mengabaikan flag -a (yang berarti "Cetak semua jalur input kosong untuk output standar saat dibaca"). EDIT diuji, tanpa -a kurang mencetak, tetapi masih terlalu banyak informasi. Jadi flag -q benar, seperti yang dikatakan vishu9219.
Rauni Lillemets
41

Jika Anda masuk ke psql di shell Linux perintahnya adalah:

\i fileName.sql

untuk jalur absolut dan

\ir filename.sql

untuk jalur relatif dari tempat Anda memanggil psql.

Florian
sumber
Seperti yang dikatakan @Florian, setelah login Anda dapat menjalankan file. Ingatlah untuk menandai setiap baris komentar di SQL Anda sebagai salah satu dari dua cara ...-- komentar ke akhir baris a) - satu komentar baris ATAU b) / * komentar beberapa baris * /
Sumit S
26

Melalui terminal, logon ke database Anda dan coba ini:

database-# >@pathof_mysqlfile.sql

atau

database-#>-i pathof_mysqlfile.sql

atau

database-#>-c pathof_mysqlfile.sql
Satish Sharma
sumber
solusi ini lebih solid bagi saya; bukan yang ditandai sebagai answe
AlexG
17

Anda dapat memberikan nama pengguna dan PASSSWORD pada baris perintah itu sendiri.

   psql "dbname='urDbName' user='yourUserName' password='yourPasswd' host='yourHost'" -f yourFileName.sql
Deepu Sahni
sumber
Ini berfungsi jika Anda tidak ingin mengatur variabel lingkungan atau menggunakan file pass aneh. =)
martin
ini seharusnya jawaban yang diterima, terima kasih
grepit
13

Anda bahkan dapat melakukannya dengan cara ini:

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

Jika Anda memiliki sudoakses pada mesin dan tidak disarankan untuk skrip produksi hanya untuk pengujian pada mesin Anda sendiri, itu adalah cara termudah.

MDK
sumber
9

Telusuri cara menjalankan SQL pada baris perintah untuk PostgreSQL di Linux:

Buka terminal dan pastikan Anda dapat menjalankan psqlperintah:

psql --version
which psql

Milik saya adalah versi 9.1.6 terletak di /bin/psql.

Buat file teks biasa bernama mysqlfile.sql

Edit file itu, letakkan satu baris di sana:

select * from mytable;

Jalankan perintah ini pada commandline (mengganti nama pengguna Anda dan nama database Anda untuk pgadmin dan kurz_prod):

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

Berikut ini adalah hasil yang saya dapatkan di terminal (saya tidak diminta kata sandi):

select * from mytable;

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

(2 rows)
Eric Leschinski
sumber
Bagaimana Anda mengatur pengguna? Ini pertama kalinya saya menginstal dan menjalankan -f pada file .sql baru. Selalu mengatakan kata sandi yang salah
mKane
4

Anda dapat membuka prompt perintah dan menjalankannya sebagai administrator. Kemudian ketik

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

Password for user postgres: akan muncul.

Ketikkan kata sandi Anda dan masukkan. Saya tidak bisa melihat kata sandi apa yang saya ketikkan, tetapi kali ini ketika saya menekan enter, kata itu berhasil. Sebenarnya saya sedang memuat data ke dalam database.

pemalas
sumber
Saya pikir maksud Anda-d "postgres"
amfetamachine
@amphetamachine -d untuk nama basis data, periksapsql --help
Yaz
1

Saya mencapai itu menulis (terletak di direktori di mana skrip saya)

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

di mana -u user peran yang memiliki database di mana saya ingin mengeksekusi skrip kemudian psqlmenghubungkan ke psqlkonsol setelah itu -d my_databasememuat saya mydatabaseakhirnya di -a -f file.sqlmana -agema semua input dari skrip dan -fjalankan perintah dari file.sqlke mydatabase, kemudian keluar.

Saya menggunakan: psql (PostgreSQL) 10.12 di (Ubuntu 10.12-0ubuntu0.18.04.1)

Chars
sumber