如何使用 GRDB Swift 迁移更改列类型?

How to change column type with migration with GRDB Swift?

我有几个 table 列的类型是 UUID

我想将这些列转换为 String 而不是 UUID,因为调试很麻烦(例如使用 sqlite 浏览文件 SQLite 的数据库浏览器要求我执行 SQL 查询,只是为了将 UUID 对象转换为 Strings 以查看 ID 值.

回到问题,最实用的方法是什么?

我在想,也在做,但我想先问一下:

  1. registerMigration 中创建一个新的 table。
  2. 新 table 现在有字符串列。
  3. 遍历旧 table 的行,并将这些行移动到新的 table 但要确保 ID 现在在 String 中而不是 [=12] =]s.
  4. 降旧table
  5. 将新 table 重命名为旧 table 的名称。
registerMigration("UUIDMigrationToString") { db in
      try db.create(table: "new_table") { table in
        table.autoIncrementedPrimaryKey("id")
        table.column("someIdStuff", .text).notNull()
      }

      // loop through the old table...
      // move the rows from the old table to the new table but with string Ids.
      // drop old table, and rename new table.
    }

GRDB 作者在这里回答了这个问题:https://github.com/groue/GRDB.swift/issues/1077

但这是我基于该答案的解决方案,应该非常简单:

import GRDB

extension DatabaseMigrator {
  /**
   Migrate UUIDs to String
   
   References:
   
   - https://github.com/groue/GRDB.swift/issues/1077
   - 
   */
  mutating func v1_8() {
    migrateStream()
  }
  
  // MARK: - Stream
  
  mutating func migrateStream() {
    registerMigration("1.8 - Stream") { db in
      
      try db.create(table: "new_stream") { table in
        table.autoIncrementedPrimaryKey("id")
        table.column("contentId", .text).notNull()
        table.column("streamId", .text).notNull()
      }
      
      let rows = try Row.fetchCursor(db, sql: "SELECT * FROM stream")
      while let row = try rows.next() {
        try db.execute(
          sql: "INSERT INTO new_stream (id, contentId, streamId) VALUES (?, ?, ?)",
          arguments: [
            row["id"],
            (row["contentId"] as UUID).uuidString,
            (row["streamId"] as UUID).uuidString
          ])
      }
      
      try db.drop(table: "stream")
      try db.rename(table: "new_stream", to: "stream")
    }
  }