加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 管理数据库更改

发布时间:2020-12-13 15:56:24 所属栏目:百科 来源:网络整理
导读:我开始使用触发器,视图,函数,CTE等将更多逻辑移动到数据库中.当plv8 / json出现在postgres中时,我可以看到自己在那里放了很多逻辑. 我在续集和activerecord中进行数据库迁移的“标准”方式存在问题.续集和activerecord都允许您将任意sql代码放入带时间戳的文
我开始使用触发器,视图,函数,CTE等将更多逻辑移动到数据库中.当plv8 / json出现在postgres中时,我可以看到自己在那里放了很多逻辑.

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

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

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

-- Migration 1
create 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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读