簡體   English   中英

postgres 使用 .sql 文件創建數據庫

[英]postgres creating database using .sql file

所以我一直在嘗試使用 .sql 文件創建一個數據庫。 我們第一次這樣做時,它運行良好,但每次都必須運行。 如果我自己在 postgres 中創建一個數據庫,該腳本運行良好,但如果我沒有手動創建該數據庫,該腳本會顯示: psql: script_name :40: ERROR: database dbname does not exist。

這是代碼:

 --dit is een psql die eerst de database project dropt, vervolgens
--maakt hij opnieuw de database project aan.
--De de tabellen die hierbij worden gemaakt zijn:
--Pathway_C1, Eiwit_C1, Gen_C1, Gen_Go_C1, Go_termen_c1 en Gen_kegg_C1

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.5.14
-- Dumped by pg_dump version 9.5.14

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;


--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


SET default_tablespace = '';

SET default_with_oids = false;

DROP DATABASE project;

CREATE DATABASE project; 

\c project

CREATE TABLE Pathway_C1 (
    Kegg_co CHAR(8) NOT NULL,
    PRIMARY KEY (Kegg_co)
);

CREATE TABLE Go_termen_C1 (
    Go_nummer CHAR(10) NOT NULL,
    Go_functie VARCHAR(1000) NOT NULL,
    PRIMARY KEY (Go_nummer)
);

CREATE TABLE Gen_C1 (
    Gen_ID INTEGER NOT NULL,
    Gen_naam VARCHAR(50) NOT NULL,
    PRIMARY KEY (Gen_ID)
);


CREATE TABLE Eiwit_C1 (
    Eiwit_ID CHAR(12) NOT NULL,
    Gen_ID INTEGER NOT NULL,
    Eiwit_naam VARCHAR(500) NOT NULL,
    Eiwit_Lengte INTEGER NOT NULL,
    PRIMARY KEY (Eiwit_ID),
    FOREIGN KEY (Gen_ID) REFERENCES Gen_C1(Gen_ID)
);

CREATE TABLE Gen_Kegg_C1 (
    Gen_ID INTEGER NOT NULL,
    Kegg_co CHAR(8) NOT NULL,
    PRIMARY KEY (Gen_ID, Kegg_co),
    FOREIGN KEY (Kegg_co) REFERENCES Pathway_C1(Kegg_co),
    FOREIGN KEY (Gen_ID) REFERENCES Gen_C1(Gen_ID)
);

CREATE TABLE Gen_Go_C1 (
    Gen_ID INTEGER NOT NULL,
    Go_nummer CHAR(10) NOT NULL,
    PRIMARY KEY (Gen_ID, Go_nummer),
    FOREIGN KEY (Gen_ID) REFERENCES Gen_C1(Gen_ID),
    FOREIGN KEY (Go_nummer) REFERENCES Go_termen_C1(Go_nummer)
);



GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO username; 

--
-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: -
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;



--
-- PostgreSQL database dump complete
--enter code here

請不要注意我們在腳本中添加的注釋,它們並不重要。

對於這個例子,我假設用戶是 postgres。

  1. 以用戶postgres登錄

    sudo -i -u postgres

  2. 將您的數據庫導出為 .sql 或 .psql

    pg_dump -h 127.0.0.1 -p 5432 db_name > db_name.sql

  3. 該文件位於/var/lib/postgresql/

  4. 將文件移動到您的項目目錄,例如

    mv db_name.sql ../../../home/projects/web/My_App/backend/

  5. 注銷用戶 postgres 並以系統用戶身份繼續

  6. 創建setup.sql文件以編寫將在數據庫上執行的命令以創建表並授予權限

    CREATE DATABASE db_name; GRANT ALL PRIVILEGES ON DATABASE db_name TO postgres;
  7. 創建一個 bash 腳本來自動化這個過程。 該文件可以命名為setup.sh並放置在項目的根目錄中

    sudo -u postgres bash -c "psql -h 127.0.0.1 -p 5432 < /home/projects/web/My_App/backend/setup.sql" sudo -U postgres bash -c "psql -h 127.0.0.1 -p 5432 -d db_name < /home/projects/web/My_App/backend/db_name.sql"
  8. 運行 bash 腳本

    bash setup.sh

請記住更改 db_name 和文件路徑以適合您在文件系統中的名稱。

您可以在腳本頂部添加一行:

CREATE DATABASE dbname;

有關CREATE DATABASEPostgreSQL文檔

另外,看起來您的腳本是使用pg_dump創建的。 pg_dump有很多選項和標志可以傳遞給它。 這些標志之一是--create

pg_dump --create標志的PostgreSQL文檔中

從命令開始輸出,以創建數據庫本身並重新連接到創建的數據庫。 (使用這種形式的腳本,在運行腳本之前連接到目標安裝中的哪個數據庫都沒有關系。)如果還指定了--clean,則腳本會刪除並在重新連接目標數據庫之前重新創建它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM