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

Posted

技术标签:

【中文标题】如何使用 GRDB Swift 迁移更改列类型?【英文标题】:How to change column type with migration with GRDB Swift? 【发布时间】:2021-12-04 10:55:04 【问题描述】:

我有几个表,其列类型为 UUID

我想将这些列转换为String 而不是UUID,因为调试很麻烦(例如,使用 DB Browser for SQLite 浏览 sqlite 文件> 要求我执行 SQL 查询只是为了将 UUID 对象转换为 Strings 以​​查看 id 值。

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

我正在考虑,并且即将做,但我想先问这个:

    registerMigration 中,创建一个新表。 新表现在有字符串列。 循环遍历旧表中的行,并将这些行移动到新表中,但请确保 ID 现在位于 Strings 而不是 UUIDs 中。 删除旧表 将新表重命名为旧表的名称。
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.
    

【问题讨论】:

【参考方案1】:

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
   - https://***.com/questions/69598215/how-to-change-column-type-with-migration-with-grdb-swift
   */
  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")
    
  

【讨论】:

以上是关于如何使用 GRDB Swift 迁移更改列类型?的主要内容,如果未能解决你的问题,请参考以下文章

swift数据库GRDB框架使用(iOS)

使用 GRDB 在 Swift 中操作 SQLite 数据库 | 快读

如何在测试 laravel 中更改迁移中的枚举类型列

EF5 Code First - 使用迁移更改列类型

如何使用 Laravel 模式构建器更改列类型?

EF5代码优先 - 使用迁移更改列类型