Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Сравнение таблиц и генерация ALTER скрипта


Автор: aluk 17.3.2011, 17:21
привет всем! Подскажите есть ли такой инструмент с помощью которого можно автоматически сгенерировать скрипт ALTER на основании сравнения двух таблиц? 

Автор: Akina 17.3.2011, 17:27
drop table <name>
create table <name> <specification>

Автор: aluk 17.3.2011, 17:39
Примерчик пожалуйста поставленной задачи.
Имею две таблицы, например, table1 и table2
нужно сравнить table2 с table1  и сгенерировать для table1 скрипт ALTER

Автор: Akina 17.3.2011, 17:57
Код

mysql> create table t1(id integer primary key auto_increment, val integer);
Query OK, 0 rows affected (0.06 sec)

mysql> create table t2(id integer primary key auto_increment, val text);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t1;
+-------+------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                               |
+-------+------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) NOT NULL default '0',
  `val` int(11)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> drop table t1;
Query OK, 0 rows affected (0.03 sec)

mysql> create table t1 select * from t2 where id is null;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table t1;
+-------+------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                               |
+-------+------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) NOT NULL default '0',
  `val` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>


Добавлено через 12 минут и 15 секунд
Но если тебе упёрлось именно ALTER TABLE - иди http://en.wikipedia.org/wiki/Comparison_of_database_tools и выбирай то, что умеет reverse/forward engineering по MySQL.

Автор: aluk 17.3.2011, 18:10
ага и все значения что были в t1 удалятся. Вопрос стоит как сгенерировать автоматом ALTER скрипт а не удалить и снова создать таблицу, легче уже удалить и просто переименовать, а задаче не в этом

Автор: Akina 17.3.2011, 18:28
Ты серьёзно? насчёт сохранения данных? преобразование типов (с возможными потерями)... изменение констрейнов (с водможным нарушением целостности)... отслеживание изменения имён (с возможным неверным установлением соответствия)... нет, такие вещи автоматом не сделать. Ручками, ручками...

Автор: aluk 17.3.2011, 18:56
на python3, по крайней мере частично. а там уже ручками =)

Код


def generate(tbl2, tbl1):
    sql = ''
    for dt in tbl2.keys():
        temp = ''
        if dt in tbl1.keys():
            if tbl2[dt] != tbl1[dt]:
                temp += 'MODIFY ' + dt + ' ' + tbl2[dt] + '\n'
        else:
            temp += 'ADD ' + dt + ' ' + tbl2[dt] + '\n'
        sql += temp + '\n'
    return sql
                 

def main(new_table):
    f = open('table1.txt', 'rt')
    table1 = f.readlines()[1:-2]
    f.close()
    f = open('table2.txt', 'rt')
    table2 = f.readlines()[1:-2]
    f.close()
    table1_res = {}
    table2_res = {}
    for row in table1:
        r_split = row.strip().split(' ')
        table1_res[r_split[0]]= ' '.join(r_split[1:])
    for row in table2:
        r_split = row.strip().split(' ')
        table2_res[r_split[0]]= ' '.join(r_split[1:])
    generate_sql = 'ALTER TABLE `' + new_table + '` '
    generate_sql += generate(table2_res, table1_res)
    print(generate_sql)


if __name__ == "__main__":
    new_table = 'generated_table'
    main(new_table)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)