使用ORM(如ODB)时处理类更改

sid*_*guy 4 c++ orm persistence odb-orm

我正在研究使用ORM(异议关系映射器)来允许我将我的C++对象持久化到SQLite数据库中.我目前正在通过CodeSynthesis考虑ODB.

请参阅:http://www.codesynthesis.com/products/odb/

看看ODB的文档,我没有看到一个唠叨问题的答案,即:

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

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

  1. 一般来说,如何在ORM工具中处理这个问题?
  2. 如何使用ODB专门做到这一点
  3. 有没有比ODB更好的ORM工具来处理这个问题?

小智 7

从一开始,全面披露:我在ODB工作.并回答你的第三个问题,不,没有;-).

但严重的是,模式演化是一个难题,它是我们TODO列表中的三大项目之一(另外两个是多数据库支持和SQL-to-C++编译器).好消息是我们已经完成了多数据库支持,下一个是模式演变.

通常,最好的方法是将您的架构(以及必要的数据)带到最新版本.使应用程序能够读取多个不同版本的替代方案似乎在现实世界中似乎没有扩展.

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

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

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