如何使用 GRDB Swift 迁移更改列类型?
How to change column type with migration with GRDB Swift?
我有几个 table 列的类型是 UUID
。
我想将这些列转换为 String
而不是 UUID
,因为调试很麻烦(例如使用 sqlite 浏览文件 SQLite 的数据库浏览器要求我执行 SQL 查询,只是为了将 UUID
对象转换为 String
s 以查看 ID 值.
回到问题,最实用的方法是什么?
我在想,也在做,但我想先问一下:
- 在
registerMigration
中创建一个新的 table。
- 新 table 现在有字符串列。
- 遍历旧 table 的行,并将这些行移动到新的 table 但要确保 ID 现在在
String
中而不是 [=12] =]s.
- 降旧table
- 将新 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")
}
}
我有几个 table 列的类型是 UUID
。
我想将这些列转换为 String
而不是 UUID
,因为调试很麻烦(例如使用 sqlite 浏览文件 SQLite 的数据库浏览器要求我执行 SQL 查询,只是为了将 UUID
对象转换为 String
s 以查看 ID 值.
回到问题,最实用的方法是什么?
我在想,也在做,但我想先问一下:
- 在
registerMigration
中创建一个新的 table。 - 新 table 现在有字符串列。
- 遍历旧 table 的行,并将这些行移动到新的 table 但要确保 ID 现在在
String
中而不是 [=12] =]s. - 降旧table
- 将新 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")
}
}