如何以编程方式访问缓存类的存储映射?

时间:2016-04-05 20:38:27

标签: intersystems-cache

我正在尝试创建一种方法,该方法会自动创建我可以保存并稍后使用的内容,这样我就可以自动将数据从一个版本的类迁移到下一个版本。

当我编译一个普通的持久化类时,"存储"得到了创建,我希望能够存档一些代码,让我重新创建这个"旧存储"所以我可以访问旧版本"来自全局并将值映射到类的当前映射。我有对象生成器方法,将保存每个记录的版本,并检测"当前版本"类代码的不同于数据记录本身保存的版本,但我不确定如何保留" old"版本实际上看起来像我可以自动将数据从" old迁移到新的"。要做到这一点,我认为能够在编译时读取当前存储的内容,我应该能够在其他地方保存该值并创建一个耐用的版本阅读器"所以我可以向前迁移数据,而不必让程序员真正开展工作。

这看起来像是一种合理的方法吗?如果有的话,有人能指出我在编译时的存储值是这样的,我可以保存数据吗?

(或者我应该在编译时将生成的%Save()方法链的某些部分克隆到附加到"其他内容的版本特定保存"(不确定是什么,但是&#39 ;东西'))

此问答最初出现在InterSystems开发者社区https://community.intersystems.com/post/how-do-you-access-storage-map-cache-class-programmatically

1 个答案:

答案 0 :(得分:2)

在数据库中,您最重要的资产是您的数据 - 业务逻辑和代码紧随其后。至少应该有人关注数据槽以获得理智,即使在大多数情况下,也无所事事。至少,在向源存储库提交代码时,任何添加或修改属性的开发人员都应该“区分”存储定义。默认情况下,类编译器将正确处理所有内容。

  1. 从一个版本的类迁移到另一个版本的最简单和最好的方法是保持相同的存储定义。类编译器将为任何新属性创建槽,并且完全是非破坏性和保守的。当我退出属性时,我通常会手动重命名存储槽并为其指定一个前缀,例如zzz。如果我选择的话,这允许我稍后明确地清理和重用这些插槽。

  2. 对于您正在寻找的前/后编译触发器的类型,我将使用投影类的RemoveProjection / CreateProjection方法,它提供“一种自定义编译或删除类时会发生什么的方法”。

  3. 您可以使用%Dictionary.CompiledStorage和相关类(Data)来完全访问类的已编译存储定义。

  4. 3A。另一种方法是使用XSLT或XML解析从导出的类定义中读取存储定义。如果您需要捕获详细信息以用于单独的源代码控制目的,我只会使用此替代方法。

    1. 最简单的存储定义使用$ ListBuild插槽和单个全局节点。当使用子类和集合属性时,默认存储定义会变得更复杂 - 这就是您真正想要坚持简单方法(第1项)的地方。