我在续集和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 – 管理数据库更改所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)