在 Postgres Docker 容器中安装扩展

在 Postgres Docker 容器中安装扩展

最近,我想使用 Fluent 迁移器来为我的 postgres 数据库做种,该数据库作为 Docker 容器运行。我基本上有一个表 User,它有一个需要自动生成的 UUID 类型的主键。

我的迁移代码如下所示。

csharp 复制代码
Create.Table(User.TABLE_NAME)
    .WithColumn("id").AsGuid().NotNullable().WithDefaultValue(SystemMethods.NewGuid).PrimaryKey()
    .WithColumn("username").AsString().NotNullable()
    .WithColumn("password").AsString().NotNullable();

上面的代码基本上会变成下面的 postgres sql:

sql 复制代码
CREATE TABLE "public"."users"
(
    "id"       uuid NOT NULL DEFAULT uuid_generate_v4(),
    "username" text NOT NULL,
    "password" text NOT NULL,
    CONSTRAINT "PK_users" PRIMARY KEY ("id")
);

请注意查询中使用的默认函数uuid_generate_v4()。如果您使用默认的 Postgres docker 映像来构建容器,这将生成以下错误信息:

text 复制代码
The error was 42883: function uuid_generate_v4() does not exist

这是因为uuid_generate_v4()这个函数是在uuid-ossp扩展中定义的,在执行创建扩展的SQL命令之前必须先将其安装在容器中。由于我们用于 docker compose 处理容器,因此我们将使用它来安装扩展。

我们将定义所需的脚本来在单独的文件中安装扩展,并将其包含在我们的 docker compose 中。

yml 复制代码
\c ntuserauth;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

在上面的代码中,我们使用了 ntuserauth 数据库(这是我们需要安装扩展的数据库),然后指示安装扩展( uuid-ossp 如果它尚不存在)。我们将脚本放在install-extensions.sql这个文件中,并将其放置在我们的脚本目录中。

然后,我们将使用上面定义的脚本复制到 docker-entrypoint-initdb.d下,并用于初始化数据库。

如果您想在从此镜像派生的镜像中进行其他初始化,请在 /docker-entrypoint-initdb.d 下添加一个或多个 *.sql*.sql.gz*.sh 脚本(如有必要,请创建该目录)。在入口点调用 initdb 创建默认的 postgres 用户和数据库后,它将运行任何 *.sql 文件,运行任何可执行的 *.sh 脚本,并获取在该目录中找到的任何不可执行的 *.sh 脚本,以在之前进行进一步的初始化启动服务。

让我们继续修改 docker compose配置 以包含脚本:

yml 复制代码
nt.authservice.db:
  image: postgres:14.1-alpine
  container_name: nt.authservice.db
  hostname: "nt.authservice.db"
  restart: always
  environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=mypassword
    - POSTGRES_DB=ntuserauth
  ports:
    - '5432:5432'
  volumes:
    - nt.authservice.db.volume:/var/lib/postgresql/data
    - ./services/db/scripts:/docker-entrypoint-initdb.d

您可以通过对容器中的数据库运行\dx命令来验证是否已正确安装扩展。

text 复制代码
                            List of installed extensions
   Name    | Version |   Schema   |                   Description
-----------+---------+------------+-------------------------------------------------
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
 uuid-ossp | 1.1     | public     | generate universally unique identifiers (UUIDs)
(2 rows)

这就确保了我们需要所需的uuid-ossp扩展已经安装在postgres容器中,并且使我们能够用Fluent的迁移功能来初始化数据库。

原文地址

相关推荐
GetcharZp11 小时前
只需 10 分钟,轻松实现异地组网!Netmaker 保姆级部署教程来了
后端
前端兰博11 小时前
03-Spring Boot
后端
前端兰博11 小时前
01-Java开发基础语言
后端
Tronlong创龙11 小时前
SBC-TL3588 单板机 / EPC-TL3588 工控机 Docker 开发手册(二)
docker·开发板·嵌入式开发·硬件开发·工业控制
前端兰博11 小时前
02-Servlet、JDBC、Maven、Mybatis
后端
咖啡八杯12 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
码事漫谈13 小时前
Loop 正在排斥人为操作
后端
爱勇宝13 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
庄周de蝴蝶13 小时前
梅开二度,这次拿下系统分析师
后端·程序员
林小帅15 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端