summaryrefslogtreecommitdiff
path: root/migrate/changeset/databases
diff options
context:
space:
mode:
authoriElectric <unknown>2009-06-20 22:33:03 +0000
committeriElectric <unknown>2009-06-20 22:33:03 +0000
commitcde0f9b52d900288d5ff85fe0e742f9d73c37e6f (patch)
tree44a8bbb3837c97e608bbb55cc55edeaff077b8b3 /migrate/changeset/databases
parent7eafe744c2b3961b303c9bb1f7f219eeb8738840 (diff)
downloadsqlalchemy-migrate-cde0f9b52d900288d5ff85fe0e742f9d73c37e6f.tar.gz
updated changeset tests. whole package is finally PEP8. fixed mysql tests&bugs. updated docs where apropriate. changeset test coverage almost at 100%
Diffstat (limited to 'migrate/changeset/databases')
-rw-r--r--migrate/changeset/databases/mysql.py50
-rw-r--r--migrate/changeset/databases/oracle.py5
-rw-r--r--migrate/changeset/databases/sqlite.py20
-rw-r--r--migrate/changeset/databases/visitor.py4
4 files changed, 42 insertions, 37 deletions
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 = {