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

原文地址

相关推荐
怕浪猫6 分钟前
第21章:微服务与分布式架构中的Go应用
后端·go·编程语言
武子康19 分钟前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
摸鱼的春哥1 小时前
Agent教程15:认识LangChain(中),状态机思维
前端·javascript·后端
风象南7 小时前
我把大脑开源给了AI
人工智能·后端
橙序员小站12 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德12 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆14 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好202515 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字15 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常15 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端