from migrate.changeset import ansisql,exceptions from sqlalchemy.databases import mysql as sa_base #import sqlalchemy as sa MySQLSchemaGenerator = sa_base.MySQLSchemaGenerator class MySQLColumnGenerator(MySQLSchemaGenerator,ansisql.ANSIColumnGenerator): def _do_quote_table_identifier(self, identifier): return '%s'%identifier pass class MySQLColumnDropper(ansisql.ANSIColumnDropper): def _do_quote_table_identifier(self, identifier): return '%s'%identifier def _do_quote_column_identifier(self, identifier): return '%s'%identifier 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): if not hasattr(delta,'result_column'): # Mysql needs the whole column definition, not just a lone name/type raise exceptions.NotSupportedError( "A column object is required to do this") column = delta.result_column if not column.table: column.table = delta.table # needed by get_column_specification colspec = self.get_column_specification(column) self.start_alter_table(table_name) self.append("CHANGE COLUMN ") self.append(col_name) self.append(' ') self.append(colspec) def visit_index(self,param): # If MySQL can do this, I can't find how raise exceptions.NotSupportedError("MySQL cannot rename indexes") def _do_quote_table_identifier(self, identifier): return '%s'%identifier class MySQLConstraintGenerator(ansisql.ANSIConstraintGenerator): def _do_quote_table_identifier(self, identifier): return '%s'%identifier class MySQLConstraintDropper(ansisql.ANSIConstraintDropper): #def visit_constraint(self,constraint): # if isinstance(constraint,sqlalchemy.schema.PrimaryKeyConstraint): # return self._visit_constraint_pk(constraint) # elif isinstance(constraint,sqlalchemy.schema.ForeignKeyConstraint): # return self._visit_constraint_fk(constraint) # return super(MySQLConstraintDropper,self).visit_constraint(constraint) def visit_migrate_primary_key_constraint(self,constraint): self.start_alter_table(constraint) self.append("DROP PRIMARY KEY") self.execute() def visit_migrate_foreign_key_constraint(self,constraint): self.start_alter_table(constraint) self.append("DROP FOREIGN KEY ") self.append(constraint.name) self.execute() def _do_quote_table_identifier(self, identifier): return '%s'%identifier class MySQLDialect(ansisql.ANSIDialect): columngenerator = MySQLColumnGenerator columndropper = MySQLColumnDropper schemachanger = MySQLSchemaChanger constraintgenerator = MySQLConstraintGenerator constraintdropper = MySQLConstraintDropper