【问题标题】:How to create database, schema, and then table inside Postgresql using init.sql如何使用 init.sql 在 Postgresql 中创建数据库、模式和表
【发布时间】: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 文件的最佳做法是什么?我将在哪里填充其他项目?

标签: postgresql docker ddl init


【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 2010-10-22
      • 2015-11-18
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2010-10-24
      相关资源
      最近更新 更多