- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
您使用什么方法对数据库进行版本控制?我已将我们所有的数据库表作为单独的 .sql 脚本提交给我们的存储库 (mercurial)。这样,如果团队中的任何成员对员工表进行了更改,我将在更新存储库时立即知道修改了哪个特定表。
这种方法描述于:What are the best practices for database scripts under code control .目前,我正在编写一个 python 脚本来执行数据库文件夹中的所有 .sql 文件,但是,由于外键约束导致的依赖性问题确保我们不能以任何顺序运行 .sql 文件。
python 脚本是生成一个文件,其中包含执行.sql 文件的顺序。它将按照 tableorder.txt 文件中出现的顺序执行 .sql 文件。一个表在它的外键表被执行之前不能被执行,例如:
表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,但是,这就是我对我的数据库进行版本控制的方式:
(这很长,但最后我希望我放弃简单模式转储作为处理数据库版本控制的主要方式的原因是显而易见的。)
我对架构进行了修改,将其应用于测试数据库。
我在上述脚本之后生成增量更改脚本和架构转储。 (我使用 ApexSQL,但可能有特定于 MySQL 的工具可以提供帮助。)
增量更改脚本知道如何从当前模式版本转到目标模式版本:ALTER TABLE existing、CREATE TABLE new、DROP VIEW old .. 多个操作可以在与 相同的 .SQL 文件中发生delta 很重要。
模式的转储是目标模式版本:CREATE TABLE a,CREATE VIEW b .. 这里没有“ALTER”或“DROP”,因为它只是目标模式的快照。每个数据库对象都有一个 .SQL 文件,因为架构很重要。
我使用 RoundhouseE 来应用增量更改脚本。 (我不使用 RoundhouseE 的“随时脚本”功能,因为它不能正确处理关系。)
我从惨痛的教训中了解到,如果没有全面的分步计划,就无法可靠地应用数据库架构更改,同样地(如问题中所述),的顺序关系依赖很重要。仅存储“当前”或“结束”模式是不够的。有许多更改不能在不知道 A->B->C 的情况下追溯应用 A->C,并且一些更改 B 可能涉及迁移逻辑或更正。 SQL 架构更改脚本可以捕获这些更改并允许它们“重放”。
然而,与此同时仅保存增量脚本并不能提供目标架构的“简单 View ”。这就是为什么我还转储所有架构以及更改脚本和版本两者。理论上, View 转储可用于构建数据库,但由于关系依赖性(问题中提到的那种),它可能需要一些工作,我不会将其用作自动模式恢复方法的一部分:然而,保留 Hg 版本控制的模式转储部分允许快速识别更改并查看特定版本的目标模式。
因此,更改增量向前移动 通过修订,而架构转储提供当前修订的 View 。因为更改增量是增量的并且仅向前,所以保持处理这些更改的分支“干净”很重要,这很容易用 Hg 做到。
在我的一个项目中,我目前处于第 70 次数据库更改 - 并且快乐且富有成效! - 切换到此设置后。 (而且这些是已部署的更改,而不仅仅是开发更改!)
快乐编码。
关于python - MySQL 的数据库版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11461707/
大家好,我完成了这个基本的 C 程序,它向输入任何给定数字集的用户显示有序集、最小值、最大值、平均值和中值。我遇到的问题是,当我打印数字时,我必须使用诸如“3.2%f”之类的东西来设置标准的精度,我怎
我有这个基于 Python 的服务守护进程,它正在执行大量多路复用 IO(选择)。 从另一个脚本(也是 Python)我想查询这个服务守护进程的状态/信息和/或控制处理(例如暂停它、关闭它、更改一些参
我读到 Fortran 对表达式求值的顺序有严格的规则。对于某些数值算法来说,这一点非常重要。 数值 C 程序如何控制浮点运算的顺序并防止编译器“优化”到不需要的运算顺序,例如将 (a*b)*c 更改
上下文: 整个问题可以概括为我正在尝试复制调用system(或fork)的行为,但在 mpi 环境中。 (事实证明,你不能并行调用system。)这意味着我有一个程序在许多节点上运行,每个节点上有一个
我考虑过控制scanf来接受c中的任何输入。我的概念是等待10秒(或任何其他时间)来接受任何输入。10秒后它将退出并且不再接收任何输入。 int main(){ int a,b,c,d; sca
我正在尝试使用生成器停止 setTimeOut 上的执行流程。我究竟做错了什么?我无法让 console.log 每 1500 毫秒退出一次。我是 node 的新手,如果我在做一件非常愚蠢的事情,请不
我希望我的应用程序的 Activity 堆栈包含同一 Activity 的多个实例,每个实例处理不同的数据。因此,我将让 Activity A 在我的 Activity 堆栈中处理数据 a、b、c 和
我有这个 bash 文件,它向设备询问 OpenSSH 的 IP、密码等。 现在,如果我使用 ssh root@ip,我必须输入密码。这真的很烦人。第二;我不能让我的脚本向它发送命令。 这就是我想要的
我正在尝试测试我有权访问的机器的缓存属性。为此,我正在尝试读取内存并对其计时。我改变工作集大小和步幅访问模式以获得不同的测量值。 代码如下所示: clock1 = get_ticks() for (i
我正在尝试编写一个 makefile 来替换用于构建相当大的应用程序的脚本之一。 当前脚本一次编译一个文件,使用 make 的主要原因是并行化构建过程。使用 make -j 16 我目前在办公室服务器
我正在制作一个小的测试程序,它演示了一个粗糙的控制台界面。 该程序是一个低于标准的典型获取行、响应程序,它甚至不识别“退出”,并希望您通过按 control-c 强制退出。在 Mingw32 上完成。
好的,我有一个 VOIP 电话。我知道电话的 IP 地址和端口,并且可以完全访问电话,我正在使用它通过 SIP 中继调用 SIP 电话。 我基本上想随时查看手机上发生的事情,但我不知道从哪里开始。 如
是否可以指定 CWinApp::WriteProfileString() 使用的应用程序名称? 如果我使用 CWinApp::SetRegistryKey 将我的公司名称设置为“MyCompany”,
我正在尝试用 Python 控制 Tor。我在 stackoverflow 上阅读了其他几个关于这个主题的问题,但没有一个能回答这个问题。 我正在寻找一种方法,以便在命令运行时为您提供“新身份”、新
最近在做一个项目,涉及到iPhone设备和手表传输数据、控制彼此界面跳转,在网上找了很多资料,发现国内的网站这方面介绍的不多,而国外的网站写的也不是很全,所以在这写这篇文章,给大家参考一下,望大神指
我想增加图中值的范围。在示例中,值的范围从 50 到 200。但是,我需要按如下方式分配值:50 75 100 125 150 175 200 并且最好使用 scale_fill_gradientn
我有一个IconButton,当按下时波纹效果是圆形的并且比按钮的面积大,我怎样才能减少点击按钮时波纹效果的大小? IconButton( constraints
我正在使用代码契约(Contract)为我的项目生成附属程序集。基本上它为项目的 MyAssembly.dll 创建一个 MyAssembly.Contracts.dll。这应该放在你的程序集旁边,但
我想使用分面绘制图形,其中面板之间的边缘不同。面板按字母顺序自动排序(按照 ggplot 中的惯例)。一个简单的例子: library(igraph) library(ggraph) g <- mak
我想为我的 Android 应用程序创建一个小部件,以显示有关位置的一些实时详细信息,例如天气。但我想在任何时候允许最多 3 个小部件实例,每个实例都有不同的位置。我不确定该怎么做,也找不到任何信息。
我是一名优秀的程序员,十分优秀!