2015-04-23 2 views

ответ

6

Как правило, вы хотите иметь путь миграции, если вы добавляете новые столбцы в существующие таблицы. Вы можете использовать атрибут 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 
} 

Вы можете также, как и Макс предложил использовать ifNotExists: на create(table:…) уровне:

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 для более сложных изменений.

+0

Я знаю, что это год назад, но как я могу получить userVersion от sqlite.swift? Я пытаюсь добавить столбцы в таблицы, которые могут или не могут уже существовать, но я не слишком уверен, как это сделать. Как проверить, существует ли таблица? потому что использование 'table.create (ifNotExists: true)' Я не могу сделать иначе, проверьте, существует ли столбец. Также как проверить, существует ли столбец? – apikurious

2

Правильный путь для быстрой 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)) 
}