gpt4 book ai didi

使用 Delphi 在已安装的应用程序中进行数据库版本控制

转载 作者:太空狗 更新时间:2023-10-30 01:45:45 26 4
gpt4 key购买 nike

我正在开发许多 Delphi 应用程序,这些应用程序需要在新版本发布时以及用户选择安装其他模块时现场升级它们自己的数据库结构。这些应用程序正在使用各种嵌入式数据库(目前是 DBISAM 和 Jet,但这可能会改变)。

在过去,我使用 DBISAM 使用用户版本号来完成此操作,而不是可以存储在每个表中。我运送了一组额外的空数据库文件,并在启动时使用 FieldDefs 比较每个表的版本号,以便在必要时更新已安装的表。虽然这很有效,但我发现必须运送数据库的备用副本很笨拙,而且较新版本的 DBISAM 已经更改了表重组方法,因此无论如何我都需要重写它。

我可以看到两种实现方式:在数据库中存储版本号并使用 DDL 脚本从旧版本获取新版本,或者在应用程序中存储数据库结构的引用版本,将引用版本与数据库进行比较在启动时,让应用程序生成 DDL 命令来升级数据库。

我认为我可能必须实现两者的一部分。我不希望应用程序每次启动时都将数据库与引用结构进行比较(太慢),因此我需要一个数据库结构版本号来检测用户是否使用过时的结构。但是,我不确定当数据库过去可能已部分更新或用户可能自己更改了数据库结构时,我是否可以信任预先编写的脚本来进行结构升级,所以我倾向于使用实际更新的引用差异。

在研究这个问题时,我发现了一些数据库版本控制工具,但它们似乎都针对 SQL Server,并且是在实际应用程序之外实现的。我正在寻找一个可以紧密集成到我的应用程序中并且可以适应不同数据库要求的过程(我知道我必须编写适配器、自定义后代类或事件代码来处理 DDL 中的差异数据库,我不介意)。

有没有人知道任何现成的东西可以做到这一点或不能做到这一点,有没有人有任何想法:

  1. 在应用程序中存储通用关系数据库结构的引用版本的最佳方式。

  2. 将引用与实际数据库进行比较的最佳方法。

  3. 生成DDL更新数据库的最佳方式。

最佳答案

这里有类似的故事。我们将数据库版本号存储在“系统”表中,并在启动时进行检查。 (如果表/字段/值不存在,那么我们知道它是版本 0,我们忘记添加那个位了!)

在开发过程中,当我们需要升级数据库时,我们会编写一个 DDL 脚本来完成这项工作,一旦我们对它工作正常感到高兴,它就会作为文本资源添加到应用程序中。

当应用程序确定它需要升级时,它会加载适当的资源并运行它/它们。如果需要升级多个版本,则必须按顺序运行每个脚本。最后发现只有几行代码。

要点是,我们实际上是直接编写 DDL,而不是使用基于 GUI 的工具以临时或“随机”方式修改表。这使得在时机成熟时构建完整的升级脚本变得更加容易。并且不需要结构差异。

关于使用 Delphi 在已安装的应用程序中进行数据库版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1804464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com