在 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的迁移功能来初始化数据库。

原文地址

相关推荐
写bug写bug4 分钟前
掌握Spring 中的 RestTemplate
java·后端·spring
麓殇⊙11 分钟前
springMVC-拦截器详解
java·后端·spring·interceptor
li_Michael_li20 分钟前
Spring Boot中@Valid 与 @Validated 注解的详解
java·spring boot·后端
橘猫云计算机设计41 分钟前
基于springboot钻孔数据管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·信息可视化·汽车·毕业设计
摆烂工程师1 小时前
Grok3 API 已经全网上线了!并且 Grok3 API 可以免费使用
前端·后端·程序员
增强1 小时前
腾讯云人脸核身服务端实现(一)
后端
Emma歌小白2 小时前
DataFrame 是否不为空
后端
拉丁解牛说技术2 小时前
AI大模型 prompt 工程指南实战
后端·程序员·mcp
有来技术2 小时前
全栈架构后端攻坚:基于 youlai - boot(开源)、Spring Boot 3 与 Spring Security 6 实现企业级权限系统全功能实战手册
java·spring boot·后端
helloworld_工程师2 小时前
Spring AI应用:利用DeepSeek+嵌入模型+Milvus向量数据库实现检索增强生成--RAG应用(超详细)
java·后端