如何在添加列之前检查它是否存在
How do I check if a column exist before adding it
我有一个数据库,如果它不存在,我想向其中添加一列。
我如何用 sqlite.swift API 做到这一点?
如果要向现有表中添加新列,通常您会希望有一个迁移路径。您可以使用 userVersion
属性来管理数据库架构的版本:
if db.userVersion < 1 {
db.create(table: users) { t in
t.column(id, primaryKey: true)
t.column(email, unique: true)
}
db.userVersion = 1
}
if db.userVersion < 2 {
db.alter(table: users, add: name)
db.alter(table: users, add: age)
db.userVersion = 2
}
您也可以按照 Max 的建议,在 create(table:…)
级别使用 ifNotExists:
:
db.create(table: users, ifNotExists: true) { t in
t.column(id, primaryKey: true)
t.column(email, unique: true)
}
但是要添加新列,您必须解析笨重的 PRAGMA 语句:
let tableInfo = Array(db.prepare("PRAGMA table_info(users)"))
if tableInfo.filter { col in col[1] == "name" } == nil {
db.alter(table: users, add: name)
}
if tableInfo.filter { col in col[1] == "age" } == nil {
db.alter(table: users, add: age)
}
几乎没有可读性(或推荐),但如果您正在处理遗留数据库,则可能是必要的。
请务必阅读 the ALTER TABLE documentation 了解更复杂的改动。
swift 2.0 的正确方法如下:
let tableInfo = Array(db.prepare("PRAGMA table_info(users)"))
let foundColumn = tableInfo.filter {
col in col[1] as! String == "name"
}
if(foundColumn.count == 0){
try! db.run(users.addColumn(name))
}
我有一个数据库,如果它不存在,我想向其中添加一列。 我如何用 sqlite.swift API 做到这一点?
如果要向现有表中添加新列,通常您会希望有一个迁移路径。您可以使用 userVersion
属性来管理数据库架构的版本:
if db.userVersion < 1 {
db.create(table: users) { t in
t.column(id, primaryKey: true)
t.column(email, unique: true)
}
db.userVersion = 1
}
if db.userVersion < 2 {
db.alter(table: users, add: name)
db.alter(table: users, add: age)
db.userVersion = 2
}
您也可以按照 Max 的建议,在 create(table:…)
级别使用 ifNotExists:
:
db.create(table: users, ifNotExists: true) { t in
t.column(id, primaryKey: true)
t.column(email, unique: true)
}
但是要添加新列,您必须解析笨重的 PRAGMA 语句:
let tableInfo = Array(db.prepare("PRAGMA table_info(users)"))
if tableInfo.filter { col in col[1] == "name" } == nil {
db.alter(table: users, add: name)
}
if tableInfo.filter { col in col[1] == "age" } == nil {
db.alter(table: users, add: age)
}
几乎没有可读性(或推荐),但如果您正在处理遗留数据库,则可能是必要的。
请务必阅读 the ALTER TABLE documentation 了解更复杂的改动。
swift 2.0 的正确方法如下:
let tableInfo = Array(db.prepare("PRAGMA table_info(users)"))
let foundColumn = tableInfo.filter {
col in col[1] as! String == "name"
}
if(foundColumn.count == 0){
try! db.run(users.addColumn(name))
}