exe/dbmigrate in ezframe-0.3.0 vs exe/dbmigrate in ezframe-0.4.0

- old
+ new

@@ -49,12 +49,16 @@ parse_create_sql(sql) end end def parse_create_sql(sql) - sql.gsub(/CREATE TABLE \`(\w+)\` \(/i, "") - table_name = $1 + # EzLog.debug("parse_create_sql: #{sql}") + if sql =~ /CREATE TABLE \`(\w+)\` \(/i + table_name = $1 + else + return + end @db_columns[table_name.to_sym] ||= {} column_a = sql.split(", ") column_a.each do |line| if line =~ /\`(\w+)\`\s(\w+)/ colkey, dbtype = $1, $2 @@ -112,20 +116,50 @@ set_default(column) next end if dbtype != new_type exec_sql("ALTER TABLE #{table_name} ALTER COLUMN #{column.key} DROP DEFAULT;") - begin - exec_sql("ALTER TABLE #{table_name} ALTER #{column.key} TYPE #{new_type};") - rescue => e - EzLog.error("alter column type error: #{e.class}:#{e}:#{e.backtrace}") - back_key = "#{column.key}_bak" - exec_sql("ALTER TABLE #{table_name} RENAME #{column.key} TO #{back_key};") + unless change_type(table, column.key, new_type) + # 失敗したときは名前を変更してカラム追加 + rename_column(table_name, column.key, "#{column.key}_bak") + add_column(table, column.key, new_type) end set_default(column) end end - # exec_sql("ALTER TABLE #{table_name} add COLUMN deleted_at timestamp;") + end + + # カラム追加 + def add_column(table_name, key, typ) + begin + exec_sql("ALTER TABLE #{table_name} ADD #{key} #{typ};") + rescue => e + EzLog.error("change_type: error: #{e.class}:#{e}:#{e.backtrace}") + return nil + end + return true + end + + # カラムの型変更 + def change_type(table_name, key, typ) + begin + exec_sql("ALTER TABLE #{table_name} ALTER #{key} TYPE #{typ};") + rescue => e + EzLog.error("change_type: error: #{e.class}:#{e}:#{e.backtrace}") + return nil + end + return true + end + + # カラムの名前変更 + def rename_column(table_name, old_key, new_key) + begin + exec_sql("ALTER TABLE #{table_name} RENAME #{old_key} TO #{new_key};") + rescue => e + EzLog.error("rename_column: error: #{e.class}:#{e}:#{e.backtrace}") + return nil + end + return true end end end end