| TABLE_TYPE = object() |
| VIEW_TYPE = object() |
| |
| |
| class NameMissingException(Exception): |
| pass |
| |
| |
| def drop_views(manager, views): |
| """ |
| Drops the specified views from the database |
| |
| If a specified view does not exist in the database, this method fails |
| without modification |
| |
| @param manager the migration manager |
| @param views the views to drop |
| """ |
| check_exists(manager, views, VIEW_TYPE) |
| for view in views: |
| manager.execute('DROP VIEW `%s`' % view) |
| |
| |
| def rename(manager, mapping): |
| """ |
| Renames specified tables in the database |
| |
| Use this to rename a specified set of tables in a database. If a source in |
| the mapping does not exist, this method fails without modification. |
| |
| @param manager the migration manager |
| @param mapping a dictionary of orig_name => new_name. Any table not matching |
| an entry in this dictionary will not be renamed |
| """ |
| check_exists(manager, (table for table, _ in mapping.iteritems()), |
| TABLE_TYPE) |
| for orig_name, new_name in mapping.iteritems(): |
| manager.execute('RENAME TABLE `%s` TO `%s`' % (orig_name, new_name)) |
| |
| |
| def move_tables(manager, src_manager, tables): |
| """ |
| Moves the specified tables from another database |
| |
| If a table does not exist in the source database, this method fails without |
| modification |
| |
| @param manager the migration manager |
| @param src_manager a migration manager that handles the source database |
| @param tables a list of tables to move |
| """ |
| check_exists(src_manager, tables, TABLE_TYPE) |
| for table in tables: |
| manager.execute('RENAME TABLE `%(db)s`.`%(table)s` TO `%(table)s`' |
| % dict(db=src_manager.get_db_name(), table=table)) |
| |
| |
| def drop_database(manager): |
| """ |
| Drops the database that the specified manager controls |
| |
| @param manager the migration manager |
| """ |
| manager.execute('DROP DATABASE `%s`' % manager.get_db_name()) |
| |
| |
| def check_exists(manager, names, type): |
| """ |
| Checks if the tables or views exists. |
| |
| Raise an Exception if any of the names do not exist |
| |
| @param manager the migration manager |
| @param names the table/view names |
| @param type one of 'TABLE' or 'VIEW' |
| """ |
| if type == TABLE_TYPE: |
| info_table = 'TABLES' |
| elif type == VIEW_TYPE: |
| info_table = 'VIEWS' |
| else: |
| raise Exception("type parameter must be either TABLE_TYPE or VIEW_TYPE") |
| |
| query = ('SELECT table_name FROM information_schema.%s ' |
| 'WHERE table_schema = %%s' % info_table) |
| rows = manager.execute(query, manager.get_db_name()) |
| existing_names = [row[0] for row in rows] |
| |
| for name in names: |
| if name not in existing_names: |
| raise NameMissingException( |
| '%s missing from database, stopping' % name) |
| |
| |
| def check_index_exists(manager, table_name, index_name): |
| """ |
| Checks if a particular index exists on the table |
| |
| @param manager the migration manager |
| @param table_name the table to check |
| @param index_name the index to check |
| """ |
| query = ('SELECT 1 FROM information_schema.statistics ' |
| 'WHERE table_schema = %s AND table_name = %s AND index_name = %s') |
| rows = manager.execute(query, manager.get_db_name(), table_name, index_name) |
| return bool(rows) |
| |
| |
| DJANGO_AUTH_TABLES = ('auth_group', 'auth_group_permissions', 'auth_permission') |
| |
| def auth_tables_exist(manager): |
| try: |
| check_exists(manager, DJANGO_AUTH_TABLES, TABLE_TYPE) |
| return True |
| except NameMissingException: |
| return False |