Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение таблиц и генерация ALTER скрипта, Сравнение таблиц и генерация ALTER скрип 
:(
    Опции темы
aluk
Дата 17.3.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 27.3.2007

Репутация: нет
Всего: -2



привет всем! Подскажите есть ли такой инструмент с помощью которого можно автоматически сгенерировать скрипт ALTER на основании сравнения двух таблиц? 
PM MAIL ICQ   Вверх
Akina
Дата 17.3.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



drop table <name>
create table <name> <specification>


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aluk
Дата 17.3.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 27.3.2007

Репутация: нет
Всего: -2



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

Это сообщение отредактировал(а) aluk - 17.3.2011, 17:41
PM MAIL ICQ   Вверх
Akina
Дата 17.3.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Код

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 - иди сюда и выбирай то, что умеет reverse/forward engineering по MySQL.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aluk
Дата 17.3.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 27.3.2007

Репутация: нет
Всего: -2



ага и все значения что были в t1 удалятся. Вопрос стоит как сгенерировать автоматом ALTER скрипт а не удалить и снова создать таблицу, легче уже удалить и просто переименовать, а задаче не в этом
PM MAIL ICQ   Вверх
Akina
Дата 17.3.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
aluk
Дата 17.3.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 27.3.2007

Репутация: нет
Всего: -2



на 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)

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1204 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.