如何使用 init.sql 在 Postgresql 中创建数据库、模式,然后 table

How to create database, schema, and then table inside Postgresql using init.sql

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

docker-撰写:

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

init.sql 里面的文件 /admin/config:

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-组合后,我看不到架构和 table。我很确定 \c bypass 使用不正确。如何连接到旁路数据库并在那里创建所有内容?

您在 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 日志会有所帮助。

你应该在你的init.sql中只留下这个:

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

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

Here is an example of configuration of Django + PostgreSQL setup and here is a guide 关于 Django 迁移。