如何使用 init.sql 在 Postgresql 中创建数据库、模式和表

Posted

技术标签:

【中文标题】如何使用 init.sql 在 Postgresql 中创建数据库、模式和表【英文标题】:How to create database, schema, and then table inside Postgresql using init.sql 【发布时间】:2022-01-24 02:38:35 【问题描述】:

我正在尝试创建一个 init.sql 文件来自动创建用户、数据库、模式和表。目前,用户和数据库已创建,但我的架构和表有问题。请参阅下面的代码:

码头工人撰写:

postgres_db:
image: postgres:14.1
restart: unless-stopped
environment:
  POSTGRES_USER: $SERVER_DB_USER
  POSTGRES_PASSWORD: $SERVER_DB_PASS
volumes:
  - ./data/postgres:/var/lib/postgresql/data
  - ./admin/config:/docker-entrypoint-initdb.d
ports:
  - "5432:5432"
networks:
  - bypass

/admin/config 中的 init.sql 文件:

CREATE USER bypass;
CREATE DATABASE bypass;
GRANT ALL PRIVILEGES ON DATABASE bypass TO bypass;

\c bypass;
CREATE SCHEMA bypass_project;

CREATE TABLE bypass_project.Bypass_Data (
    id serial PRIMARY KEY,
    Date_Time TIMESTAMP,
    Module VARCHAR(25),
    Area VARCHAR(25),
                         );

运行 docker-compose up 后,我无法看到架构和表格。我很确定\c bypass 使用不正确。如何连接到旁路数据库并在那里创建所有内容?

【问题讨论】:

你确定要在这里做吗?通常它是在应用程序级别通过一些迁移机制完成的。 我绝对是数据库管理的新手。我正在制作一个应用程序,它将不断地将数据从 Python 写入 Postgresql。我假设必须先构建数据库结构,然后数据才能流入其中。放入 init.sql 文件的最佳做法是什么?我将在哪里填充其他项目? 【参考方案1】:

CREATE TABLE 语句中的 SQL 语法肯定有错误。您应该删除尾随逗号:

CREATE TABLE bypass_project.Bypass_Data (
    id serial PRIMARY KEY,
    Date_Time TIMESTAMP,
    Module VARCHAR(25),
    Area VARCHAR(25)
);

您也可以尝试(第二个bypass 是您的数据库用户):

\c bypass bypass;

而不是

\c bypass;

另外,\c 是一个特定于 psql 的命令。如果您尝试在另一个客户端中执行包含此类命令的 SQL 脚本,它将无法正常工作。

在这种情况下,您可以尝试使用init.sh 脚本而不是init.sql,并在您的bash 脚本中使用psql。您可以查看完整示例 here。

如果对您没有帮助,您能否提供更多信息?我认为 docker-compose log 会有所帮助。

【讨论】:

【参考方案2】:

你应该把这个留在你的init.sql

CREATE USER bypass;
CREATE DATABASE bypass;
GRANT ALL PRIVILEGES ON DATABASE bypass TO bypass;

然后您应该公开数据库端口并从您的应用程序容器连接到它。如果您使用 Python,正如您在评论中提到的,您应该使用一些数据库迁移机制,如 Django ORM 或 SQLAlchemy。在部署python应用迁移机制时应该调用,它会实现你的数据库的状态。

Here 是 Django + PostgreSQL 设置的配置示例,这里是关于 Django 迁移的guide。

【讨论】:

以上是关于如何使用 init.sql 在 Postgresql 中创建数据库、模式和表的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

如何在 MySQL 中同时更新和选择

如何从 PL/SQL 有条件地退出 SQL Plus

如何在 Grafana-zabbix 仪表板中编写设置

如何连接到 Pivotal HD(来自 Spark)?

如何在每个测试方法之前和之后执行sql脚本