You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

封装Postgres至专用Phoenix应用的动态数据库实现问询

嘿,咱们来好好梳理你的这个Phoenix动态数据库代理方案,细节如下:

方案目标

构建一个Phoenix应用(#1),它关联的Postgres数据库初始状态是无任何数据表,启动后处于等待配置的状态。当它通过HTTP从其他Phoenix应用(#2)接收到迁移文件与模型/schema文件后,会执行以下操作:

  • 运行数据库迁移
  • 启动supervisor(App1.Repo, [])
  • 将接收的模型/schema存入worker(App1.Models, [])的状态中,以此支持Repo.all(User)这类查询操作
  • 之后持续监听应用#2的请求,代为操作Postgres数据库
设计核心原因

这个方案的核心是让数据库与应用#2完全隔离——应用#2需要进行数据库操作时,只需要向应用#1发送Ecto查询请求,由应用#1负责执行并返回结果。我们可以为不同的客户端应用(#2、#3、#4等)分别启动应用#1的独立实例,每个实例对应不同的模型/schema:客户端首次连接时提供配置,应用#1根据配置初始化Postgres,之后就可以接收并处理查询请求。

执行流程示例
  • 应用#1从应用#2接收User模型文件以及对应的数据库迁移文件
  • 应用#1执行迁移文件,完成Postgres数据库的初始化
  • 应用#1启动包含Ecto、Repo以及User模型的GenServer,开始监听客户端请求
  • 应用#1收到请求%{ query: 'User', command: 'all' }后,执行Repo.all(User)并将查询到的用户列表返回给应用#2
待解决问题
  • 这个方案是否可行?有没有根本性的设计缺陷?
  • 应用#1如何在不重启服务器的前提下,动态执行接收到的迁移文件?能不能把迁移文件存入指定目录后,调用Mix.Tasks.Ecto.Migrate.run()来执行?

注:第三个问题已经有了解决思路——通过动态创建模块的方式实现查询操作。

内容的提问来源于stack exchange,提问作者Ilya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:05:59