如何使用 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 中创建数据库、模式和表的主要内容,如果未能解决你的问题,请参考以下文章