def get_alter_ops(table): schema = table.schema drops = [] ops = [] for column in table.column_list: if column.prev is None: sql = '%s %s' % (schema.ADD_COLUMN, column.get_sql()) ops.append( Op(sql, obj=column, type='create', prefix=alter_table(table))) elif column.get_definition() != column.prev.get_definition(): ops.extend(column.get_alter_ops()) for cols, fkey in table.foreign_keys.items(): sql = fkey.get_create_command() prev_fkey = table.prev.foreign_keys.get(cols) if prev_fkey is None: ops.append(Op(sql, obj=fkey, type='create')) elif sql != prev_fkey.get_create_command(): drops.extend(prev_fkey.get_drop_ops()) ops.append(Op(sql, obj=fkey, type='create')) for cols, index in table.indexes.items(): if index.is_pk or index.is_unique: continue sql = index.get_create_command() prev_index = table.prev.indexes.get(cols) if prev_index is None: ops.append(Op(sql, obj=index, type='create')) elif sql != prev_index.get_create_command(): drops.extend(prev_index.get_drop_ops()) ops.append(Op(sql, obj=index, type='create')) for column in table.prev.column_list: if column.new is None: drops.extend(column.get_drop_ops()) return drops + ops
def get_alter_ops(column): table = column.table schema = column.table.schema sql = '%s %s' % (schema.ALTER_COLUMN, column.get_sql()) provider = table.schema.provider sql, _ = provider.ast2sql(['ALTER COLUMN']) return [Op(sql, obj=column, type='alter', prefix=alter_table(table))]
def get_rename_ops(column): prev_table = column.table schema = prev_table.schema quote_name = schema.provider.quote_name prev_name = quote_name(column.name) sql = '%s %s %s' % ('CHANGE', prev_name, column.new.get_sql()) return [ Op(sql, obj=column, type='rename', prefix=alter_table(prev_table)) ]
def get_rename_ops(column): prev_table = column.table schema = prev_table.schema quote_name = schema.provider.quote_name prev_name = quote_name(column.name) new_name = quote_name(column.new.name) sql = 'RENAME %s TO %s' % (prev_name, new_name) return [ Op(sql, obj=column, type='rename', prefix=alter_table(prev_table)) ]
def get_drop_ops(foreign_key): schema = foreign_key.table.schema quote_name = schema.provider.quote_name sql = 'DROP CONSTRAINT %s' % quote_name(foreign_key.name) return [ Op(sql, obj=foreign_key, type='drop', prefix=alter_table(foreign_key.table)) ]
def get_alter_ops(column): table = column.table provider = table.schema.provider quote_name = provider.quote_name prefix = '%s %s' % (table.schema.ALTER_COLUMN, quote_name(column.name)) ops = [] if column.sql_type != column.prev.sql_type: if column.prev.sql_type.lower() in ('json', 'jsonb'): if column.sql_type.lower() != 'text': sql_type = 'TEXT::%s' % column.sql_type else: sql_type = column.sql_type else: sql_type = column.sql_type sql = '%s TYPE %s USING %s::%s' % ( prefix, column.sql_type, quote_name(column.name), sql_type) ops.append( Op(sql, obj=column, type='alter', prefix=alter_table(table))) if column.is_not_null and not column.prev.is_not_null: sql = '{} SET NOT NULL'.format(prefix) ops.append( Op(sql, obj=column, type='alter', prefix=alter_table(table))) elif not column.is_not_null and column.prev.is_not_null: sql = '{} DROP NOT NULL'.format(prefix) ops.append( Op(sql, obj=column, type='alter', prefix=alter_table(table))) if column.sql_default is None and column.prev.sql_default is not None: sql = '{} DROP DEFAULT'.format(prefix) ops.append( Op(sql, obj=column, type='alter', prefix=alter_table(table))) elif column.sql_default is not None and column.prev.sql_default != column.sql_default: value_class = provider.sqlbuilder_cls.value_class value = value_class(provider.paramstyle, column.sql_default) sql = '{} SET DEFAULT {}'.format(prefix, value) ops.append( Op(sql, obj=column, type='alter', prefix=alter_table(table))) return ops
def get_drop_ops(column): table = column.table schema = table.schema quote_name = schema.provider.quote_name sql = 'DROP COLUMN %s' % quote_name(column.name) return [Op(sql, obj=column, type='drop', prefix=alter_table(table))]
def get_rename_ops(table): schema = table.schema provider = schema.provider quote_name = provider.quote_name sql = '%s %s' % ('RENAME TO', quote_name(table.new.name)) return [Op(sql, obj=table, type='rename', prefix=alter_table(table))]
def get_alter_ops(column): sql = '%s %s' % ('MODIFY', column.get_sql()) return [ Op(sql, obj=column, type='alter', prefix=alter_table(column.table)) ]