postgresql – 管理数据库更改

postgresql – 管理数据库更改,第1张

概述我开始使用触发器,视图,函数,CTE等将更多逻辑移动到数据库中.当plv8 / json出现在postgres中时,我可以看到自己在那里放了很多逻辑. 我在续集和activerecord中进行数据库迁移的“标准”方式存在问题.续集和activerecord都允许您将任意sql代码放入带时间戳的文件中.运行每个文件时,将使用文件名(或文件名中的时间戳)更新schema_versions表,该表记录了 我开始使用触发器,视图,函数,CTE等将更多逻辑移动到数据库中.当plv8 / Json出现在postgres中时,我可以看到自己在那里放了很多逻辑.

我在续集和activerecord中进行数据库迁移的“标准”方式存在问题.续集和activerecord都允许您将任意sql代码放入带时间戳的文件中.运行每个文件时,将使用文件名(或文件名中的时间戳)更新schema_versions表,该表记录了已将哪些迁移应用于当前数据库.

如果在数据库级别进行大量编码,则意味着对现有视图,函数等的修改遵循以下模式:

迁移1定义了一个函数和一个使用该函数的视图.

-- Migration 1create function calculate(x int) returns int as $$                               return x + 1;                                                                 $$language sql;                                                                create vIEw foos as (                                                             select something,calculate(something) from a_table                           );

需求发生变化,我需要更改功能类型.在迁移2中,我必须删除所有依赖于foo的对象,并通过复制它们的整个身体来重新创建它们 – 即使大多数其他代码没有任何变化!

-- Migration 2                                                              -- Have to drop all vIEws and functions that depend on the                  -- `calculate(int)` function.                                               drop vIEw foos;                                                             create or replace calculate(x bigint) returns bigint as $$                   return x + 1;                                                             $$language sql;                                                            -- I Could do `drop function calculate(int) cascade`,-- but I might accIDentally drop some objects that wouldn't get recreated below.-- Now I have to recreate foo.                                              create vIEw foos as (                                                         select something,calculate(something) from a_table                       );

如果我正在构建一个基于视图,函数和触发器的系统,我的迁移将填充重复的代码,并且很难找到最新版本的代码.您可能会说“不要那样做!”,但就我的目的而言(电子商务,运输,交易),我发现让数据库通过逻辑确保数据的完整性更容易,更快捷在数据库内.

您(当然)可以转储当前的数据库模式(包括所有代码定义),但我认为您会丢失评论.而且您通常不希望编辑包含整个架构的巨型文件.

关于如何解决这个问题的任何想法?

我最好的想法是如何将sql代码包含在他们自己的规范文件中(app / sql / orders / shipPing.sql,app / sql / orders / creation.sql等).每个人都直接在这些上发展.无论什么时候发布,你都需要创建一个新的迁移文件,查看自上一版本以来所有已更改的代码,找出需要删除和重新创建的数据库对象的依赖关系链,然后复制将sql从规范的sql文件转换为新的续集/ activerecord迁移文件.但这很痛苦. :/

很受欢迎.我希望我能够很好地解释这一点,我正在削减我的咖啡因摄入量,而且我有点昏昏沉沉的atm.

哦,我在Stack Overflow上问了一个类似的问题:Changing the type of a column used in other views答案是一个允许我传入的函数:

>运行sql代码
>要删除和重新创建的数据库视图

该函数将检索视图定义,删除视图,运行sql代码,然后重新创建视图定义(以丢弃的相反顺序).也许像这样的函数系统可以帮助解决必须将sql代码复制/粘贴到迁移文件中的问题.

解决方法 我推荐 liquibase.

您可以创建跟踪数据库更改的文件,这些文件将以正确的迁移顺序运行到数据库中.

总结

以上是内存溢出为你收集整理的postgresql – 管理数据库更改全部内容,希望文章能够帮你解决postgresql – 管理数据库更改所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1159336.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存