封装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
相关产品推荐
相关产品推荐

