草庐IT

python - MySQL 的数据库版本控制

coder 2023-10-09 原文

您使用什么方法对数据库进行版本控制?我已将我们所有的数据库表作为单独的 .sql 脚本提交给我们的存储库 (mercurial)。这样,如果团队中的任何成员对员工表进行了更改,我将在更新存储库时立即知道修改了哪个特定表。

这种方法描述于:What are the best practices for database scripts under code control . 目前,我正在编写一个 python 脚本来执行数据库文件夹中的所有 .sql 文件,但是,由于外键约束导致的依赖性问题确保我们不能以任何顺序运行 .sql 文件。

python 脚本是生成一个文件,其中包含执行.sql 文件的顺序。它将按照 tableorder.txt 文件中出现的顺序执行 .sql 文件。一个表在它的外键表被执行之前不能被执行,例如:

表格顺序.txt

表3.sql
表1.sql
table7.sql等

我已经通过解析“show create table”mysql 命令的结果,从代码生成了每个表的依赖项列表。依赖列表可能如下所示:

tblstate: tblcountry //tblcountry.sql must be executed before tblstate.sql etc
tblemployee: tbldepartment, tblcountry

要生成 tableorder.txt 的内容,我需要一个如下所示的算法:

function print_table(table):
  foreach table in database:
    if table.dependencies.count == 0
      print to tableorder.txt
    if table.dependencies.count > 0
      print_table(dependency) //print dependency first
end function

如您所想,这涉及大量递归。我开始怀疑这样做是否值得?如果那里有一些工具?考虑到依赖关系,有什么工具(或算法)可以生成执行单独的 .sql 表和 View 的顺序列表?对每个表/ View 进行版本控制单独的 .sql 文件更好,还是将整个数据库版本控制为单个 .sql 文件更好?我将不胜感激任何回复,因为这花了很多天。谢谢。

最佳答案

我不使用 MySQL,而是使用 SQL Server,但是,这就是对我的数据库进行版本控制的方式:

(这很长,但最后我希望我放弃简单模式转储作为处理数据库版本控制的主要方式的原因是显而易见的。)

  1. 我对架构进行了修改,将其应用于测试数据库

  2. 我在上述脚本之后生成增量更改脚本架构转储。 (我使用 ApexSQL,但可能有特定于 MySQL 的工具可以提供帮助。)

    1. 增量更改脚本知道如何从当前模式版本转到目标模式版本:ALTER TABLE existing、CREATE TABLE new、DROP VIEW old .. 多个操作可以在与 相同的 .SQL 文件中发生delta 很重要。

    2. 模式的转储是目标模式版本:CREATE TABLE a,CREATE VIEW b .. 这里没有“ALTER”或“DROP”,因为它只是目标模式的快照。每个数据库对象都有一个 .SQL 文件,因为架构很重要。

  3. 我使用 RoundhouseE 来应用增量更改脚本。 (我使用 RoundhouseE 的“随时脚本”功能,因为它不能正确处理关系。)

我从惨痛的教训中了解到,如果没有全面的分步计划,就无法可靠地应用数据库架构更改,同样地(如问题中所述),的顺序关系依赖很重要。仅存储“当前”或“结束”模式是不够的。有许多更改不能在不知道 A->B->C 的情况下追溯应用 A->C,并且一些更改 B 可能涉及迁移逻辑或更正。 SQL 架构更改脚本可以捕获这些更改并允许它们“重放”。

然而,与此同时仅保存增量脚本并不能提供目标架构的“简单 View ”。这就是为什么我还转储所有架构以及更改脚本和版本两者。理论上, View 转储可用于构建数据库,但由于关系依赖性(问题中提到的那种),它可能需要一些工作,我不会将其用作自动模式恢复方法的一部分:然而,保留 Hg 版本控制的模式转储部分允许快速识别更改并查看特定版本的目标模式。

因此,更改增量向前移动 通过修订,而架构转储提供当前修订的 View 。因为更改增量是增量的并且仅向前,所以保持处理这些更改的分支“干净”很重要,这很容易用 Hg 做到。

在我的一个项目中,我目前处于第 70 次数据库更改 - 并且快乐且富有成效! - 切换到此设置后。 (而且这些是已部署的更改,而不仅仅是开发更改!)

快乐编码。

关于python - MySQL 的数据库版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11461707/

有关python - MySQL 的数据库版本控制的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  6. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  7. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  8. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  9. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐