从Postgres获取模式更新
我有几个Node微服务连接到同一个PostgreSQL数据库。同时我还有一个用于后端与前端之间实时消息传递的Elixir服务。
现在我在为实时服务增加一些新功能,因此在mix中加入了ecto和 ash_postgres,并连接到PostgreSQL。因为核心应用是Node.js,我希望它成为数据库模式变更的唯一权威来源,Elixir应用应从中拉取更新后的模式到模型层。我们有一个多模式数据库,public模式将是只读的,而elx将是Elixir的完全访问模式。
我尝试使用introspex
mix ecto.gen.schema --repo RealtimeService.Repo.Public --path lib/realtime_service/ --module-prefix RealtimeService.Db.Public.Models --schema public
它确实生成了初始模式,但只是为包含枚举和jsonb对象的字段写了注释。同时我也无法再次拉取更新。
- 我需要一种从数据库更新Elixir应用中模型层的方法;数据库模式中的任何变更,即使只是Elixir应用需要的,也应由Node应用来完成,以维护数据库的唯一权威来源。
- 还需要对枚举的支持,jsonb可以简单映射为map,我认为数组类型已经成功拉取。
- 我还需要能够再次拉取模式变更,而不把所有内容都覆盖回去。
解决方案
你想要的其实并不是在Ecto/Ash中官方支持的“模式拉取”工作流。
如果Node是模式变更的唯一来源,那么Elixir应将数据库视为一个外部契约,手动维护Ecto/Ash的映射。只需要使用一次mix ecto.gen.schema 或mix ash_postgres.gen.resources 来搭建脚手架,之后就不要再依赖它们进行持续同步。
jsonb 注释是预期中的,因为生成器无法仅从模式元数据推断出正确的Ecto类型。枚举应该映射到 Ecto.Enum,但JSON/JSONB通常需要手动定义为 :map或数组类型。
此外,如果Node拥有迁移,请不要让Ash也拥有它们。对于现有/共享的表,在Elixir中进行映射,并在这些资源上禁用迁移的所有权。
换句话说:先搭建一次,之后全部手动维护。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。