Kết nối với PSQL, DROP DB hiện có, tạo nó bằng CREATE và chạy một số truy vấn một mình và từ các tệp bằng cách sử dụng tập lệnh Bash


0

Tôi cần một số lời khuyên để tạo một kịch bản giúp tôi với nhiệm vụ lặp đi lặp lại, tôi làm mọi lúc trên môi trường phát triển. Tôi có một máy chủ PostgreSQL và vì tôi đang phát triển một ứng dụng web nên tôi cần bỏ, tạo và điền vào một số bảng mọi lúc và đây là một quá trình tẻ nhạt. Vì vậy, tôi cần xây dựng một số loại bash script để giúp tôi về điều này. Về cơ bản, đây là công việc lặp đi lặp lại mà tôi làm mọi lúc, từ GUI pgAdmin:

#!/bin/sh
psql -u postgres -w  // this line should connect to PostgreSQL asking for a password since I not found other way to pass the password on that line

DROP DATABASE sis_db; // drop the DB

CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1; // create the DB

// Create some schemas on the DB ( I don't know if I should select the DB first)
CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;

Và cuối cùng tôi nên tải khoảng 10 .sql tập tin nhưng không biết nếu -filename cho phép nhiều hơn một tập tin tại một thời điểm. Tôi cần một số lời khuyên về kịch bản bash này vì tôi không biết làm thế nào để có được nó, có ai có thể giúp tôi không?

Cập nhật: Cách tiếp cận tập lệnh đầu tiên

Ok, bằng cách thực hiện một nghiên cứu sâu, tôi đi kèm với giải pháp này có hiệu quả nhưng bỏ lỡ một số điều mà tôi cũng cần. Tôi đã thực hiện kịch bản này:

#!/bin/sh

# kill all connections to the postgres server
echo "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity where pg_stat_activity.datname='sis_db';" | psql -U postgres -w

# drop the DB
echo "DROP DATABASE sis_db;" | psql -U postgres -w

# create the DB
echo "CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;" | psql -U postgres -w

# create schemas
echo "CREATE SCHEMA nomencladores AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA negocio AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w
echo "CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;" | psql -U postgres -d sis_db -w

Nó sẽ sử dụng một /root/.pgpass tập tin mà tôi đã tạo và cấu hình. Kịch bản ngay bây giờ đang hoạt động như tôi muốn nhưng điều tôi không biết là làm thế nào để thêm một số tệp cùng một lúc, nghĩa là, sau khi tạo lược đồ thực thi nội dung của sql1.sql, sql2.sql và như vậy, bất kỳ trợ giúp hoặc lời khuyên?

Câu trả lời:


1

Đây là bộ xương có thể được sử dụng trực tiếp trong tập lệnh bash:

#!/bin/sh
psql -U postgres << END_OF_SCRIPT

DROP DATABASE sis_db; -- drop the DB

CREATE DATABASE sis_db WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;

\c sis_db

-- Create some schemas on the DB

CREATE SCHEMA nomencladores AUTHORIZATION postgres;
CREATE SCHEMA negocio AUTHORIZATION postgres;
CREATE SCHEMA usuarios_externos AUTHORIZATION postgres;

END_OF_SCRIPT

Một vài bình luận:

  • -u sẽ không làm việc, nó -U, tùy chọn là trường hợp nhạy cảm.

  • CREATE DATABASE không tự động kết nối với cơ sở dữ liệu mới, \c sis_db hiện và là cách duy nhất để các đối tượng được tạo sau này trong tập lệnh thuộc về cơ sở dữ liệu đó.

  • bình luận cuối dòng bắt đầu bằng -- trong SQL, không phải //

  • Các --file tùy chọn không thể được sử dụng nhiều lần trên dòng lệnh, chỉ có cái cuối cùng sẽ được vinh danh. Tuy nhiên \i fileN.sql từ bên trong psql có thể được sử dụng để bao gồm một loạt các tập tin.

  • thận trọng về lỗi. Theo mặc định, tập lệnh sẽ tiếp tục sau một lỗi, có thể có các hiệu ứng không mong muốn như tạo các đối tượng trong cơ sở dữ liệu sai. Điều này có thể tránh được với -vON_ERROR_STOP=1 trên dòng lệnh của psql, hoặc \set ON_ERROR_STOP on từ bên trong kịch bản.

  • Kiểm tra psql trang , nó giải thích tất cả điều này và nhiều hơn nữa.


bạn có thể xem qua lời mời mới nhất của tôi không? Tôi tìm ra kịch bản nhưng bỏ lỡ một số phần và tôi không biết cách thêm chúng vào, bạn có thể giúp tôi hoàn thành kịch bản không?
ReynierPM

Vì bản cập nhật của bạn đã chạy một psql mới cho mỗi lệnh SQL, tôi không thể thấy cách sắp xếp danh sách psql -f script1.sql... psql -f scriptN.sql sẽ là một vấn đề
Daniel Vérité
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.