gpt4 book ai didi

c++ - 使用 ORM(例如 ODB)时处理类更改

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:17 38 4
gpt4 key购买 nike

我正在考虑使用 ORM(对象关系映射器)来将我的 C++ 对象保存到 SQLite 数据库中。我目前正在考虑通过 CodeSynthesis 进行 ODB。

参见:http://www.codesynthesis.com/products/odb/

查看 ODB 的文档,我没有看到我有一个烦人的问题的答案,即:

如果我创建了一个类,将其保存到数据库中,但随后在我的产品的更高版本中更改了该类,会发生什么情况。当用户获得我的软件的新版本时,旧数据将如何正确加载到新版本的类中?

我之前看过 boost::serialize,它有处理这种“升级”的机制,但我想知道:

  1. 一般来说,ORM 工具是如何处理这个问题的?
  2. 具体如何使用 ODB 执行此操作
  3. 有没有比 ODB 更好的 ORM 工具来处理这个问题?

最佳答案

从一开始就完全公开:我在 ODB 上工作。回答你的第三个问题,不,没有任何 ;-)。

但说真的,模式演化是一个难题,它是我们 TODO 列表中的三大项目之一(另外两个是多数据库支持和 SQL-to-C++ 编译器)。好消息是我们几乎完成了对多数据库的支持,下一个是模式演进。

一般来说,最好的方法似乎是将您的架构(和数据,如果需要)升级到最新版本。让应用程序能够读取多个不同版本的替代方案似乎在现实世界中无法扩展。

举个例子,假设我们向类中添加了一个数据成员,在数据库架构级别转换为向相应表中添加一列。处理这个问题的方法是使这个新列可以为空(例如,使用 odb::nullable 或 boost::optional)。这里的想法是,没有该列值的旧数据将为 NULL(应用程序可以检测和处理)。

接下来我们需要升级数据库中的架构。在这种情况下,我们将需要执行 ALTER TABLE ADD COLUMN 语句来添加新列。一旦 ODB 支持模式演进,它就会自动生成这些迁移语句。现在您将不得不自己编写它们(我知道这很痛苦)。表中的所有现有行都将自动为此列分配 NULL 值。

因此,通常情况下,应用程序将包含一组这样的语句,用于将架构从一个版本升级到下一个版本。例如,从 1 到 2,从 2 到 3,等等。数据库将存储模式版本,应用程序将知道其最新的模式版本。之后立马打开数据库,应用程序将检查数据库版本,如果它低于应用程序架构版本,它将开始运行这些迁移集以将架构升级到最新版本。

关于c++ - 使用 ORM(例如 ODB)时处理类更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13632093/

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