From cde0f9b52d900288d5ff85fe0e742f9d73c37e6f Mon Sep 17 00:00:00 2001 From: iElectric Date: Sat, 20 Jun 2009 22:33:03 +0000 Subject: updated changeset tests. whole package is finally PEP8. fixed mysql tests&bugs. updated docs where apropriate. changeset test coverage almost at 100% --- migrate/changeset/databases/mysql.py | 50 ++++++++++++++++++---------------- migrate/changeset/databases/oracle.py | 5 ++-- migrate/changeset/databases/sqlite.py | 20 +++++++------- migrate/changeset/databases/visitor.py | 4 ++- 4 files changed, 42 insertions(+), 37 deletions(-) (limited to 'migrate/changeset/databases') diff --git a/migrate/changeset/databases/mysql.py b/migrate/changeset/databases/mysql.py index fc65569..ea83d2a 100644 --- a/migrate/changeset/databases/mysql.py +++ b/migrate/changeset/databases/mysql.py @@ -20,39 +20,28 @@ class MySQLColumnDropper(ansisql.ANSIColumnDropper): class MySQLSchemaChanger(MySQLSchemaGenerator, ansisql.ANSISchemaChanger): - def visit_column(self, delta): - keys = delta.keys() - if 'type' in keys or 'nullable' in keys or 'name' in keys: - self._run_subvisit(delta, self._visit_column_change) - if 'server_default' in keys: - # Column name might have changed above - col_name = delta.get('name', delta.current_name) - self._run_subvisit(delta, self._visit_column_default, - col_name=col_name) - - def _visit_column_change(self, table_name, col_name, delta): + def visit_column(self, column): + delta = column.delta + table = column.table + colspec = self.get_column_specification(column) + if not hasattr(delta, 'result_column'): - # Mysql needs the whole column definition, not just a lone - # name/type + # Mysql needs the whole column definition, not just a lone name/type raise exceptions.NotSupportedError( - "A column object is required to do this") + "A column object must be present in table to alter it") - column = delta.result_column - # needed by get_column_specification - if not column.table: - column.table = delta.table - colspec = self.get_column_specification(column) - # TODO: we need table formating here - self.start_alter_table(self.preparer.quote(table_name, True)) - self.append("CHANGE COLUMN ") - self.append(self.preparer.quote(col_name, True)) - self.append(' ') + self.start_alter_table(table) + + old_col_name = self.preparer.quote(delta.current_name, column.quote) + self.append("CHANGE COLUMN %s " % old_col_name) self.append(colspec) + self.execute() def visit_index(self, param): # If MySQL can do this, I can't find how raise exceptions.NotSupportedError("MySQL cannot rename indexes") + class MySQLConstraintGenerator(ansisql.ANSIConstraintGenerator): pass @@ -67,9 +56,22 @@ class MySQLConstraintDropper(ansisql.ANSIConstraintDropper): def visit_migrate_foreign_key_constraint(self, constraint): self.start_alter_table(constraint) self.append("DROP FOREIGN KEY ") + constraint.name = self.get_constraint_name(constraint) self.append(self.preparer.format_constraint(constraint)) self.execute() + def visit_migrate_check_constraint(self, *p, **k): + raise exceptions.NotSupportedError("MySQL does not support CHECK" + " constraints, use triggers instead.") + + def visit_migrate_unique_constraint(self, constraint, *p, **k): + self.start_alter_table(constraint) + self.append('DROP INDEX ') + constraint.name = self.get_constraint_name(constraint) + self.append(self.preparer.format_constraint(constraint)) + self.execute() + + class MySQLDialect(ansisql.ANSIDialect): columngenerator = MySQLColumnGenerator columndropper = MySQLColumnDropper diff --git a/migrate/changeset/databases/oracle.py b/migrate/changeset/databases/oracle.py index fc45a0f..abdaad8 100644 --- a/migrate/changeset/databases/oracle.py +++ b/migrate/changeset/databases/oracle.py @@ -1,10 +1,11 @@ """ Oracle database specific implementations of changeset classes. """ +import sqlalchemy as sa +from sqlalchemy.databases import oracle as sa_base from migrate.changeset import ansisql, exceptions -from sqlalchemy.databases import oracle as sa_base -import sqlalchemy as sa + OracleSchemaGenerator = sa_base.OracleSchemaGenerator diff --git a/migrate/changeset/databases/sqlite.py b/migrate/changeset/databases/sqlite.py index 94ac940..fa9f381 100644 --- a/migrate/changeset/databases/sqlite.py +++ b/migrate/changeset/databases/sqlite.py @@ -3,10 +3,10 @@ .. _`SQLite`: http://www.sqlite.org/ """ -from migrate.changeset import ansisql, exceptions, constraint from sqlalchemy.databases import sqlite as sa_base -from sqlalchemy import Table, MetaData -#import sqlalchemy as sa + +from migrate.changeset import ansisql, exceptions + SQLiteSchemaGenerator = sa_base.SQLiteSchemaGenerator @@ -20,12 +20,13 @@ class SQLiteCommon(object): class SQLiteHelper(SQLiteCommon): def visit_column(self, column): - try: - table = self._to_table(column.table) - except: - table = self._to_table(column) - raise + table = self._to_table(column.table) table_name = self.preparer.format_table(table) + + # we remove all constraints, indexes so it doesnt recreate them + table.indexes = set() + table.constraints = set() + self.append('ALTER TABLE %s RENAME TO migration_tmp' % table_name) self.execute() @@ -42,7 +43,7 @@ class SQLiteColumnGenerator(SQLiteSchemaGenerator, SQLiteCommon, ansisql.ANSIColumnGenerator): """SQLite ColumnGenerator""" - def visit_alter_foriegn_keys(self, column): + def add_foreignkey(self, constraint): """Does not support ALTER TABLE ADD FOREIGN KEY""" self._not_supported("ALTER TABLE ADD CONSTRAINT") @@ -51,7 +52,6 @@ class SQLiteColumnDropper(SQLiteHelper, ansisql.ANSIColumnDropper): """SQLite ColumnDropper""" def _modify_table(self, table, column): - del table.columns[column.name] columns = ' ,'.join(map(self.preparer.format_column, table.columns)) return 'INSERT INTO %(table_name)s SELECT ' + columns + \ ' from migration_tmp' diff --git a/migrate/changeset/databases/visitor.py b/migrate/changeset/databases/visitor.py index f0fa973..2f282c7 100644 --- a/migrate/changeset/databases/visitor.py +++ b/migrate/changeset/databases/visitor.py @@ -2,8 +2,10 @@ Module for visitor class mapping. """ import sqlalchemy as sa -from migrate.changeset.databases import sqlite, postgres, mysql, oracle + from migrate.changeset import ansisql +from migrate.changeset.databases import sqlite, postgres, mysql, oracle + # Map SA dialects to the corresponding Migrate extensions dialects = { -- cgit v1.2.1