Chạy tệp PostgreSQL .sql bằng cách sử dụng đối số dòng lệnh


540

Tôi có một số tệp .sql có hàng ngàn câu lệnh INSERT trong đó và cần chạy các phần chèn này trên cơ sở dữ liệu PostgreQuery của tôi để thêm chúng vào bảng. Các tệp lớn đến mức không thể mở chúng và sao chép các câu lệnh INSERT vào cửa sổ soạn thảo và chạy chúng ở đó. Tôi đã tìm thấy trên Internet rằng bạn có thể sử dụng các mục sau bằng cách điều hướng đến thư mục bin của bản cài đặt PostgreQuery của bạn:

psql -d myDataBase -a -f myInsertFile

Trong trường hợp của tôi:

psql -d HIGHWAYS -a -f CLUSTER_1000M.sql

Sau đó tôi được yêu cầu nhập mật khẩu cho người dùng của mình, nhưng tôi không thể nhập bất cứ điều gì và khi tôi nhấn enter, tôi gặp lỗi này:

psql: FATAL: xác thực mật khẩu không thành công cho người dùng "myUsername"

Tại sao nó không cho tôi nhập mật khẩu. Có cách nào để làm điều này vì điều quan trọng là tôi có thể chạy các tập lệnh này không?

Tôi đã khắc phục vấn đề này bằng cách thêm một mục mới trong tệp pg_hba.conf của tôi với cấu trúc sau:

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

Tệp pg_hba.conf thường có thể được tìm thấy trong thư mục 'dữ liệu' trong bản cài đặt PostgreQuery của bạn.


6
Bạn đã có câu trả lời của mình nhưng chỉ trong trường hợp ... "Tôi không thể nhập bất cứ điều gì", bạn có thể nói về thực tế là việc nhập mật khẩu của bạn không hiển thị gì không? Điều đó là bình thường trong trường hợp này, thông thường gõ mật khẩu và nhấn Enter sẽ hoạt động ...
Évelyne Lachance

Tôi gặp vấn đề tương tự khi cài đặt bản sao ITIS ( itis.gov ). Cơ sở dữ liệu không tồn tại, vì vậy tôi không thể sử dụng tên của nó. Do cách thức hoạt động của PostgreSQL, tôi có thể làm điều này: psql --port = 5554 --username = root --file = ITIS.sql template1
Cyberknight 16/1/2015

Câu trả lời:


157

Bạn có bốn lựa chọn để cung cấp mật khẩu:

  1. Đặt biến môi trường PGPASSWORD. Để biết chi tiết, xem hướng dẫn:
    http://www.postgresql.org/docs/civerse/static/libpq-envars.html
  2. Sử dụng tệp .pgpass để lưu mật khẩu. Để biết chi tiết, xem hướng dẫn:
    http://www.postgresql.org/docs/civerse/static/libpq-pgpass.html
  3. Sử dụng "xác thực tin cậy" cho người dùng cụ thể đó: http://www.postgresql.org/docs/civerse/static/auth-methods.html#AUTH-TRUST
  4. Kể từ PostgreSQL 9.1, bạn cũng có thể sử dụng chuỗi kết nối :
    https://www.postgresql.org/docs/civerse/static/libpq-connect.html#LIBPQ-CONNSTRING

Chào. Bây giờ tôi đã đặt cài đặt thành tin cậy nhưng tôi nhận thấy rằng phần mềm đang cố gắng sử dụng tên người dùng windows của tôi để đăng nhập. Tôi muốn sử dụng một vai trò mà tôi đã thiết lập trong cơ sở dữ liệu Postgresql của mình. Có cách nào để nói với nó vai trò nào được sử dụng để chạy lệnh không?
CSharpened 16/03 '

2
@CSharpened: sử dụng -utham số như được ghi trong tài liệu hướng dẫn
a_horse_with_no_name

# 2 cực kỳ đơn giản. Chỉ cần thêm một dòng chứa host: port: db: user: pass vào một tệp và bạn đã hoàn tất. Công việc tốt đẹp.
Kriil

494

Tất nhiên, bạn sẽ gặp phải một lỗi nghiêm trọng khi xác thực, vì bạn không bao gồm tên người dùng ...

Hãy thử cái này, nó ổn với tôi :)

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

Nếu cơ sở dữ liệu ở xa, sử dụng cùng một lệnh với máy chủ

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

4
Lưu ý rằng tên người dùng được cung cấp phải là một vai trò postgres hợp lệ. Mặc định là người dùng hiện đang đăng nhập.
matthias krull

8
Tại sao các -aparam?
AlikElzin-kilaka

5
@ AlikElzin-kilaka -akhông cần thiết ở đây. Đó là "In tất cả các dòng đầu vào không trống sang đầu ra tiêu chuẩn khi chúng được đọc"
mjspier

Đây phải là câu trả lời được chấp nhận.
Kostanos

316

Bạn nên làm như thế này:

\i path_to_sql_file

Xem:

Nhập mô tả hình ảnh ở đây


2
Tôi nhận đượcPermission denied
Zac

4
sau khi làm chmod 777 myfilelỗi Permission deniedđã được cố định
Ulug'bek Ro'zimboyev

5
@Zac nếu Quyền của bạn bị từ chối xảy ra trên máy tính windows, bạn có thể đang sử dụng dấu gạch chéo sai.
pssandstrom

2
Tôi đã gặp lỗi này trên windows và hóa ra đó là dấu gạch chéo, như @pgsandstrom đã đề cập. Thay vào đó, dấu gạch chéo sai = sử dụng dấu gạch chéo về phía trước và không có trích dẫn trên đường dẫn. \ ic: /dev/script.sql
Dave

50

Sử dụng điều này để thực thi các tệp * .sql khi máy chủ PostgreSQL được đặt ở một vị trí khác:

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

Sau đó, bạn được nhắc nhập mật khẩu của người dùng.

EDIT: được cập nhật dựa trên nhận xét được cung cấp bởi @zwacky


5
@ ChickenWing24 -a: tất cả tiếng vang , -q: yên tĩnh , -f: tập tin
zwacky

Điều này đã giải quyết vấn đề của riêng tôi, thật tuyệt
Temi 'Topsy' Bello

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

1
Làm thế nào tôi có thể làm điều đó mà không có đầu ra
Lu32 8/2/2016

2
psql -h <host> -d <cơ sở dữ liệu> -U <user_name> -p <port> -a -q -w -f <file> .sql
vishu9219

3
@ Lu32 Bạn cũng có thể bỏ cờ -a (có nghĩa là "In tất cả các dòng đầu vào không trống sang đầu ra tiêu chuẩn khi chúng được đọc"). EDIT đã thử nghiệm, không có - nó in ra ít hơn, nhưng vẫn còn quá nhiều thông tin. Vì vậy, cờ -q là chính xác, như vishu9219 đã nói.
Rauni Lillemets 17/2/2016

41

Nếu bạn đã đăng nhập vào psql trên Linux shell, lệnh là:

\i fileName.sql

cho một con đường tuyệt đối và

\ir filename.sql

cho đường dẫn tương đối từ nơi bạn đã gọi là psql.


Như @Florian nói, một khi đã đăng nhập, bạn có thể thực thi một tệp. Hãy nhớ đánh dấu bất kỳ dòng nhận xét nào trong SQL của bạn theo một trong hai cách ...-- nhận xét đến cuối dòng a) - một dòng nhận xét HOẶC b) / * nhiều nhận xét dòng * /
Sumit S

26

Thông qua thiết bị đầu cuối đăng nhập vào cơ sở dữ liệu của bạn và thử điều này:

database-# >@pathof_mysqlfile.sql

hoặc là

database-#>-i pathof_mysqlfile.sql

hoặc là

database-#>-c pathof_mysqlfile.sql

giải pháp này là vững chắc hơn đối với tôi; không phải là người được đánh dấu là đã trả lời
AlexG

17

Bạn có thể cung cấp cả tên người dùng và PASSSWORD trên chính dòng lệnh.

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

Điều này hoạt động nếu bạn không muốn đặt các biến môi trường hoặc sử dụng các tệp pass lạ. =)
martin

đây nên là câu trả lời được chấp nhận, cảm ơn bạn
grepit

13

bạn thậm chí có thể làm theo cách này:

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

Nếu bạn có sudoquyền truy cập trên máy và nó không được khuyến nghị cho các tập lệnh sản xuất chỉ để thử nghiệm trên máy của bạn, đó là cách dễ nhất.


9

Hướng dẫn cách chạy SQL trên dòng lệnh cho PostgreSQL trong Linux:

Mở một thiết bị đầu cuối và đảm bảo bạn có thể chạy psqllệnh:

psql --version
which psql

Của tôi là phiên bản 9.1.6 nằm trong /bin/psql.

Tạo một tệp văn bản đơn giản được gọi là mysqlfile.sql

Chỉnh sửa tập tin đó, đặt một dòng trong đó:

select * from mytable;

Chạy lệnh này trên dòng lệnh (thay thế tên người dùng và tên cơ sở dữ liệu của bạn cho pgadmin và Kurz_prod):

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

Sau đây là kết quả tôi nhận được trên thiết bị đầu cuối (Tôi không được nhắc nhập mật khẩu):

select * from mytable;

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

(2 rows)

Làm thế nào để bạn thiết lập một người dùng? Đây là lần đầu tiên tôi cài đặt và chạy -f trên một tệp .sql mới. Luôn nói sai mật khẩu
mKane

4

Bạn có thể mở một dấu nhắc lệnh và chạy với tư cách quản trị viên. Sau đó gõ

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

Password for user postgres: sẽ xuất hiện

Nhập mật khẩu của bạn và nhập. Tôi không thể thấy mật khẩu những gì tôi đã gõ, nhưng lần này khi tôi nhấn enter, nó hoạt động. Thật ra tôi đang tải dữ liệu vào cơ sở dữ liệu.


Tôi nghĩ ý bạn là-d "postgres"
amphetamachine

@amphetamachine -d cho tên cơ sở dữ liệu, kiểm trapsql --help
Yaz

1

Tôi đã đạt được điều đó đã viết (nằm trong thư mục chứa tập lệnh của tôi)

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

nơi -u user là vai trò những người sở hữu cơ sở dữ liệu mà tôi muốn thực thi kịch bản thì psqlkết nối đến psqlgiao diện điều khiển sau đó -d my_databasetải tôi mydatabasecuối cùng -a -f file.sqlnơi -avang tất cả các đầu vào từ kịch bản và -fthực hiện các lệnh từ file.sqlvào mydatabase, sau đó thoát ra.

Tôi đang sử dụng: psql (PostgreSQL) 10.12 trên (Ubuntu 10.12-0ubfox0.18.04.1)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.