1

如果相应的表有现有数据,我们如何安全地更改数据库类datatype的属性?Starcounter

例子

现存的:int PostalCode

想要的: string PostalCode

4

2 回答 2

6

更改数据库类的属性意味着重构数据库模式,即更改相应列的类型。此类更改不受无缝支持,并且 Starcounter 不提供内置工具。可以手动完成,但是比较麻烦。

我看到两种方法:

  1. 使用stardump工具卸载数据库并使用 SQLite 等外部工具修改架构和数据。
  2. 通过更改应用程序架构的几个步骤,首先将数据从int列移动到string列,然后将列重命名为原始列。

请记住始终备份您的数据库。

我更详细地描述了第二种方法。

步骤 I:将数据从 int 移动到 string

  1. string向数据库类添加新的类型属性,例如,PostalCodeString
  2. 添加并执行应用程序代码,它将遍历类的所有实例并设置PostalCodeString为原始转换的值int PostalCode
  3. 停止应用程序并执行 SQL 语句以删除列:ALTER TABLE TheClassName DROP COLUMN PostalCode
  4. 从类定义中删除旧属性PostalCode并删除转换代码。
  5. 启动应用程序并测试它是否按预期工作

第二步:重命名列

  1. 添加具有旧列名称的新属性,即PostalCode类型string
  2. 以与步骤 I 类似的方式将数据从PostalCodeStringto移动PostalCode,即通过应用程序代码遍历类的所有实例。
  3. 删除列PostalCodeString

我自己没有测试过这些步骤,但我希望它能起作用。主要关注的是PostalCode在第二步中创建。

编辑:自 2017 年 12 月 18 日以来,仅在最新的候选版本中完全支持 drop column SQL 语句。

于 2017-12-28T22:27:00.000 回答
0

如果 PostalCode 只是一个 int 那么这应该可以工作。

PostalCode.ToString();
于 2017-12-28T16:01:42.697 回答