Skip to content

Instantly share code, notes, and snippets.

@yyamasak
Last active January 13, 2016 12:18
Show Gist options
  • Select an option

  • Save yyamasak/bedac3fd563577a9382e to your computer and use it in GitHub Desktop.

Select an option

Save yyamasak/bedac3fd563577a9382e to your computer and use it in GitHub Desktop.
Do the same operation as ALTER TABLE table RENAME COLUMN column TO column
package require sqlite3
proc format_sql {sql} {
set sql [regsub -all -line -- {--.+$} $sql ""]
set sql [string map [list "\n" ""] $sql]
set sql [string map [list "," ",\n"] $sql]
set sql [string map [list "(" "(\n"] $sql]
set sql [string map [list ")" "\n)"] $sql]
return $sql
}
proc get_column_names {db table} {
set pragma [format {PRAGMA table_info('%s')} $table]
set names [list]
foreach {cid name type notnull dflt_value pk} [$db eval $pragma] {
lappend names $name
}
return $names
}
proc rename_column {db table old_column new_column} {
set old_columns [get_column_names $db $table]
set idx [lsearch $old_columns $old_column]
set new_columns [lreplace $old_columns $idx $idx $new_column]
set old_columns_csv [join $old_columns ,]
set new_columns_csv [join $new_columns ,]
set sql [$db onecolumn {SELECT sql FROM sqlite_master WHERE name = $table}]
set sql [format_sql $sql]
set old_lines [split $sql \n]
set new_lines [list]
foreach line $old_lines {
lappend new_lines [string map [list $old_column $new_column] $line]
}
set create_sql [join $new_lines \n]
set unq [clock seconds]
set old "${table}"
set tmp "${table}_temp_$unq"
$db eval "ALTER TABLE $old RENAME TO $tmp"
$db eval $create_sql
$db eval "INSERT INTO $old ($new_columns_csv) SELECT $old_columns_csv FROM $tmp"
$db eval "DROP TABLE $tmp"
}
proc cleanup {db} {
$db eval {VACUUM}
$db eval {REINDEX}
}
if {[info exists ::argv0] && $::argv0 eq [info script]} {
set dbfile "app.db"
sqlite3 db $dbfile
db transaction {
rename_column db "users" "name" "user_name"
}
cleanup db
db close
exit
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment