【问题标题】:postgres creating database using .sql filepostgres 使用 .sql 文件创建数据库
【发布时间】:2019-05-15 04:46:09
【问题描述】:

所以我一直在尝试使用 .sql 文件创建数据库。 我们第一次这样做时,它工作得很好,但它必须每次都工作。 如果我自己在 postgres 中创建数据库,则脚本可以完美运行,但如果我没有手动创建数据库,脚本会显示:psql:script_name:40: ERROR: database dbname 不存在。

这是代码:

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

请不要关注我们在脚本中放入的 cmets,它们并不是很重要。

【问题讨论】:

    标签: database bash postgresql ubuntu psql


    【解决方案1】:

    对于这个例子,我假设用户是 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 和文件路径以适合您在文件系统中的名称。

    【讨论】:

      【解决方案2】:

      您可以在脚本顶部添加一行:

      CREATE DATABASE dbname;
      

      CREATE DATABASE 上的PostgreSQL Documentation

      此外,您的脚本似乎是使用pg_dump 创建的。 pg_dump 有很多选项和标志可以传递给它。其中一个标志是--create

      来自PostgreSQL Documentation on the pg_dump--create 标志:

      以创建数据库本身的命令开始输出,然后 重新连接到创建的数据库。 (使用这种形式的脚本,它 无论您在目标安装中使用哪个数据库 在运行脚本之前连接到。)如果还指定了 --clean, 该脚本在重新连接之前删除并重新创建目标数据库 给它。

      【讨论】:

        猜你喜欢
        • 2022-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        相关资源
        最近更新 更多