使用ORM(如ODB)时处理类更改 我正在研究使用ORM(Objor ReloalMeMatter)来让我把C++对象保存到SQLite数据库中。我目前正在考虑ODB的代码合成

使用ORM(如ODB)时处理类更改 我正在研究使用ORM(Objor ReloalMeMatter)来让我把C++对象保存到SQLite数据库中。我目前正在考虑ODB的代码合成,c++,orm,persistence,odb-orm,C++,Orm,Persistence,Odb Orm,见: 查看ODB的文档,我没有看到一个困扰我的问题的答案,那就是: 如果我创建了一个类,将它持久化到DB中,然后在我的产品的更高版本中更改该类,会发生什么。当用户获得我的软件的新版本时,如何将旧数据正确加载到类的新版本中 我以前看过boost::serialize,它有处理这种“升级”的机制,但我想知道: 一般来说,ORM工具是如何处理这个问题的 具体如何使用ODB实现这一点 有没有比ODB更好的ORM工具来处理这个问题 从一开始,充分披露:我从事ODB工作。回答你的第三个问题,不,没有;-)

见:

查看ODB的文档,我没有看到一个困扰我的问题的答案,那就是:

如果我创建了一个类,将它持久化到DB中,然后在我的产品的更高版本中更改该类,会发生什么。当用户获得我的软件的新版本时,如何将旧数据正确加载到类的新版本中

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

  • 一般来说,ORM工具是如何处理这个问题的
  • 具体如何使用ODB实现这一点
  • 有没有比ODB更好的ORM工具来处理这个问题

  • 从一开始,充分披露:我从事ODB工作。回答你的第三个问题,不,没有;-)

    不过,说真的,模式演化是一个很难解决的问题,它是我们待办事项列表中的三大项目之一(另外两个是多数据库支持和SQL-to-C++编译器)。好消息是我们已经基本完成了对多数据库的支持,下一步就是模式演化

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

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

    接下来,我们需要升级数据库中的模式。在这种情况下,我们需要执行ALTERTABLEADDCOLUMN语句,该语句将添加新列。一旦ODB支持模式演化,它将自动生成这些迁移语句。现在你必须自己写(我知道,这很痛苦)。表中所有现有行将自动为此列分配空值

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

    < P>如果您仍然开放于Adto to ODB,则可以考虑KuCE:(以及完全公开:我写了)。
    关于升级数据类型的具体问题:quince不会自动检测到需要进化,也不会为进化设计策略,或者诸如此类的事情。它给你的是一个C++接口来改变表。但从积极的方面看,它都是C++级别的:你描述你的C++数据类型的改变,并且所有这些都是静态类型检查的。

    我想我所问的是“模式进化”。我不确定这是不是正确的行话,但听起来是对的。很酷,谢谢你的确切答案。到目前为止,我同意ODB非常棒,在这方面做得非常好!现在我们只需要有人为堆栈溢出做一个ODB标记,我的代表不够高。:)标签添加得太晚…;)