在颠覆项目结构中寻找正确处理配置和数据库模式文件
Posted
技术标签:
【中文标题】在颠覆项目结构中寻找正确处理配置和数据库模式文件【英文标题】:looking fo the proper handling of config and database schema files in subversion project structure 【发布时间】:2013-01-07 11:56:12 【问题描述】:在 SVN 中,我们有一个项目,其中包含使用休眠等的所有数据库逻辑。但是,该项目取决于处于与代码匹配的特定状态的数据库模式。
同样,我们还会在 Config 目录中运行用于服务器的配置脚本。
如何在 SVN 中正确设置项目结构来克服这一点?
结构可能是这样的:
--DBHibernateProject
------trunk
------branches
------tags
--DatabaseScriptsProject
------trunk
------branches
------tags
--ConfigProject
------trunk
------branches
------tags
但是我们如何将数据库脚本项目绑定到 DBHibernateProject 的 Release-1.0 呢? hibernate 项目在 maven 存储库中有一个可部署的资产(jar),但 db 脚本没有。我想确保正确的数据库脚本与应用程序的正确版本相关联。
【问题讨论】:
您已经在标签中提到了 maven,为什么不使用依赖项的版本? 当脚本项目实际上没有资产(war、jar 等)时,如何使用它的依赖项。它只是一个 pom 依赖吗? 【参考方案1】:您要么通过流程完成,要么制作一个 SVN 项目。
您可以为团队制定一条规则,当您完成一组数据库内容时,您可以使用与它所使用的代码的标签相同的标签对其进行标记。这可能很乏味,但如果更改通常在数据库和代码之间同步,则可行。
另一种方法是在 SVN 中创建一个带有一个主干和一组标签和分支的项目。然后,您可以通过在存储库的顶层放置一些包含代码、脚本和休眠内容的文件夹来完成同样的事情。可以管理您的 SVN 存储库的权限,以便不同的人对特定文件夹具有写权限,但这会产生每次分支时不断修改权限的成本(如果您愚蠢地允许修改标签,则可能是标签)
【讨论】:
我考虑过 SVN 中的单个项目,但大多数人使用的似乎少于多个项目。我们想使用多个项目,因为我们将有不相关的项目。此外,一些使用数据库的项目可能有自己的版本。 IE - ProjectA 1.0 使用 DBProject 1.0 但 ProjectB 2.0 使用 DBProject 1.0。【参考方案2】:我强烈建议使用liquibase 来管理您的数据库迁移。更改文件是从类路径中读取的,这意味着它们可以与匹配的 Hibernate 类文件一起部署在同一个 jar 中。
我从未使用过它,但 liquibase 确实支持 hibernate,这可能会很有用。
有关 Maven 示例,请参阅:
Lock oracle database before running the Delete/Load data scripts我推荐一些更多的理论阅读:
http://martinfowler.com/articles/evodb.html http://www.codinghorror.com/blog/2008/02/get-your-database-under-version-control.html为了公平起见,在同一功能空间中还有一些其他工具:
http://flywaydb.org/ http://code.google.com/p/dbmigrate/【讨论】:
【参考方案3】:如果“项目依赖于...”意味着“对于 DBHibernateProject 的每个修订版,我们必须使用 DatabaseScriptsProject 和 ConfigProject 的预定义和固定修订版(它们在 DBHibernateProject 树中使用/引用)”您始终可以使用纯颠覆端解决方案:带有 PEG 修订的外部
如果不了解源树结构,就不能说更多:“依赖”和“也有配置脚本”不能(容易)翻译成正式的依赖,比如(我糟糕的重构)
DBHibernateProject 的每个修订版必须有相关的 DatabaseScriptsProject(用于此代码的正确架构)和 ConfigProject(用于生成数据库模式的脚本,即 DBHibernateProject 使用)
如果我的重建是正确的,在 Subversion 样式中(没有 Maven,这可能是我的错误)我将在 DBHibernateProject 树中创建两个目录类型的外部,它们在 DatabaseScriptsProject 和 ConfigProject 中引用“某种状态下的某些树”分别是树
【讨论】:
【参考方案4】:数据库项目难道不能有一个看起来像这样的单一项目布局:
----DatabaseProject
-------trunk
--------DBHibernateProject
--------DatabaseScriptsProject
-------branches
-------tags
----OtherProject
-------trunk
-------branches
-------tags
----ConfigProject
-------trunk
-------branches
-------tags
如果配置项目不绑定到其他项目,而只是服务器的脚本,那么我猜你可以将它作为与 OtherProject 相同的布局。
【讨论】:
【参考方案5】:-
将我所有的 SQL 脚本保存在 SVN 中
不允许修改它们(如果要更改某些内容,请创建包含正确 SQL 语句的新 SQL 文件)
配置 maven dbpatch 插件 https://github.com/m-szalik/dbpatch-maven-plugin
【讨论】:
以上是关于在颠覆项目结构中寻找正确处理配置和数据库模式文件的主要内容,如果未能解决你的问题,请参考以下文章
springBoot项目打jar包后,修改配置文件中的配置项