如何使用 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 迁移。
我正在尝试创建一个 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 迁移。