2012-03-16 37 views
275

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

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 yêu cầu một mật khẩu cho người dùng của tôi , nhưng tôi không thể nhập bất cứ điều gì và khi tôi nhấn enter tôi nhận được lỗi này:

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

Tại sao nó không cho phép tôi nhập mật khẩu. Có cách nào vòng này vì nó là quan trọng mà tôi có thể chạy các kịch bản này?

tôi xung quanh vấn đề này bằng cách thêm một mục mới trong tập tin pg_hba.conf tôi với cấu trúc sau:

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

File pg_hba.conf thường có thể được tìm thấy trong thư mục 'dữ liệu' của PostgreSQL của bạn cài đặt, dựng lên.

+4

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

+0

Tôi đã có một vấn đề tương tự như cài đặt một bản sao của ITIS (http://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ó. Bởi vì cách PostgreSQL hoạt động, tôi có thể làm điều này: psql --port = 5554 --username = root --file = ITIS.sql template1 – Cyberknight

Trả lời

79

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

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

Xin chào. Bây giờ tôi đã thiết lập các thiết lập để tin tưởng 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 cửa sổ 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 cho nó vai trò nào để sử dụng để chạy lệnh? – CSharpened

+1

@CSharpened: sử dụng tham số '-u' như được ghi trong hướng dẫn –

+0

# 2 cực kỳ đơn giản. Chỉ cần thêm một dòng chứa máy chủ lưu trữ: port: db: user: chuyển đến một tệp và bạn đã hoàn tất. Công việc tốt đẹp. – Kriil

291

Tất nhiên, bạn sẽ nhận được một lỗi nghiêm trọng để xác thực, bởi vì bạn không bao gồm tên người dùng ...

Hãy thử cái này, nó là OK cho tôi :)

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

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

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

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

+1

Tại sao tham số '-a'? –

+0

@ AlikElzin-kilaka '-a' là không cần thiết ở đây. Đó là "In tất cả các dòng đầu vào không rỗng thành đầu ra tiêu chuẩn khi chúng được đọc" – superbly

5

Walk qua thế nào để chạy một lệnh SQL trên dòng lệnh cho PostgreSQL trong Linux:

Mở một terminal và chắc chắn rằng bạn có thể chạy các psql lệnh:

psql --version 
which psql 

Mine là phiên bản 9.1.6 đặt tại /bin/psql .

Tạo một textfile đơn giản gọi là mysqlfile.sql

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

select * from mytable; 

Chạy lệnh này trên dòng lệnh (thay tên người dùng và tên của 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 yêu cầu mật khẩu):

select * from mytable; 

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

(2 rows) 
18

Qua bến đăng nhập vào cơ sở dữ liệu của bạn và cố gắng này:

database-# >@pathof_mysqlfile.sql 

hoặc

database-#>-i pathof_mysqlfile.sql 

hoặc

database-#>-c pathof_mysqlfile.sql 
+0

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

3

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

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

Password for user postgres: sẽ hiển thị.

Nhập mật khẩu của bạn và nhập. Tôi không thể nhìn 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ó làm việc. Trên thực tế tôi đã tải dữ liệu vào cơ sở dữ liệu.

+0

Tôi nghĩ rằng bạn có nghĩa là '-d" postgres "' – amphetamachine

+0

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

181

Bạn nên làm điều đó như thế này:

\i path_to_sql_file 

Xem:

Enter image description here

+0

tôi nhận được' Quyền từ chối ' – Zac

+3

sau khi làm 'chmod 777 myfile 'lỗi 'Permission denied' đã được cố định –

28
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ần đầu ra – Lu32

+1

psql -h -d -U -p -a -q -w -f sql – vishu9219

+3

@ Lu32 Bạn cũng có thể bỏ qua flag -a (có nghĩa là "In tất cả các dòng đầu vào không rỗng thành đầu ra tiêu chuẩn khi chúng được đọc"). EDIT thử nghiệm, mà không -a 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. –

15

Sử dụng này để thực thi file * sql khi máy chủ PostgreSQL tọa lạc ở một nơi khác biệt :

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 

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

+2

tâm giải thích cái gì là '-a' và' -q'? – ChickenWing24

+3

@ ChickenWing24 '-a': tất cả echo,' -q': quiet, '-f': file – zwacky

9

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 
+0

Tác vụ này nếu bạn không muốn đặt biến môi trường hoặc sử dụng các tệp vượt qua kỳ lạ. =) – martin

4

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

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

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

1

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

\i fileName.sql 

cho một đường dẫn tuyệt đối và

\ir filename.sql 

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

Các vấn đề liên quan