From f687cd3fe04737ffe3ef7dd5aded1a8f781c93f9 Mon Sep 17 00:00:00 2001 From: "christian.simms" Date: Thu, 28 Aug 2008 01:17:44 +0000 Subject: [PATCH] add support for SA 0.5 --- migrate/changeset/ansisql.py | 12 ++++-------- migrate/changeset/databases/mysql.py | 2 +- migrate/changeset/databases/oracle.py | 8 ++++---- migrate/changeset/schema.py | 4 ++-- test/changeset/test_changeset.py | 24 ++++++++++++------------ test/fixture/database.py | 2 +- 6 files changed, 24 insertions(+), 28 deletions(-) diff --git a/migrate/changeset/ansisql.py b/migrate/changeset/ansisql.py index 34a34bc..cab07d4 100644 --- a/migrate/changeset/ansisql.py +++ b/migrate/changeset/ansisql.py @@ -124,7 +124,8 @@ class ANSISchemaChanger(AlterTableVisitor,SchemaGenerator): self._run_subvisit(delta,self._visit_column_type) if 'nullable' in keys: self._run_subvisit(delta,self._visit_column_nullable) - if 'default' in keys: + if 'server_default' in keys: + # Skip 'default': only handle server-side defaults, others are managed by the app, not the db. self._run_subvisit(delta,self._visit_column_default) #if 'primary_key' in keys: # #self._run_subvisit(delta,self._visit_column_primary_key) @@ -172,14 +173,9 @@ class ANSISchemaChanger(AlterTableVisitor,SchemaGenerator): else: self.append("SET NOT NULL") def _visit_column_default(self,table_name,col_name,delta): - default = delta['default'] - # Default must be a PassiveDefault; else, ignore - # (Non-PassiveDefaults are managed by the app, not the db) - if default is not None: - if not isinstance(default,sa.PassiveDefault): - return + server_default = delta['server_default'] # Dummy column: get_col_default_string needs a column for some reason - dummy = sa.Column(None,None,default=default) + dummy = sa.Column(None,None,server_default=server_default) default_text = self.get_column_default_string(dummy) self.start_alter_table(table_name) self.append("ALTER COLUMN %s "%col_name) diff --git a/migrate/changeset/databases/mysql.py b/migrate/changeset/databases/mysql.py index e971893..1a87ff3 100644 --- a/migrate/changeset/databases/mysql.py +++ b/migrate/changeset/databases/mysql.py @@ -13,7 +13,7 @@ class MySQLSchemaChanger(MySQLSchemaGenerator,ansisql.ANSISchemaChanger): keys = delta.keys() if 'type' in keys or 'nullable' in keys or 'name' in keys: self._run_subvisit(delta,self._visit_column_change) - if 'default' in keys: + 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) diff --git a/migrate/changeset/databases/oracle.py b/migrate/changeset/databases/oracle.py index c420593..1bb616d 100644 --- a/migrate/changeset/databases/oracle.py +++ b/migrate/changeset/databases/oracle.py @@ -22,7 +22,7 @@ class OracleSchemaChanger(OracleSchemaGenerator,ansisql.ANSISchemaChanger): def visit_column(self,delta): keys = delta.keys() - if 'type' in keys or 'nullable' in keys or 'default' in keys: + if 'type' in keys or 'nullable' in keys or 'default' in keys or 'server_default' in keys: self._run_subvisit(delta,self._visit_column_change) if 'name' in keys: self._run_subvisit(delta,self._visit_column_name) @@ -36,7 +36,7 @@ class OracleSchemaChanger(OracleSchemaGenerator,ansisql.ANSISchemaChanger): # Oracle cannot drop a default once created, but it can set it to null. # We'll do that if default=None # http://forums.oracle.com/forums/message.jspa?messageID=1273234#1273234 - dropdefault_hack = (column.default is None and 'default' in delta.keys()) + dropdefault_hack = (column.server_default is None and 'server_default' in delta.keys()) # Oracle apparently doesn't like it when we say "not null" if the # column's already not null. Fudge it, so we don't need a new function notnull_hack = ((not column.nullable) and ('nullable' not in delta.keys())) @@ -45,7 +45,7 @@ class OracleSchemaChanger(OracleSchemaGenerator,ansisql.ANSISchemaChanger): if dropdefault_hack: - column.default = sa.PassiveDefault(sa.sql.null()) + column.server_default = sa.PassiveDefault(sa.sql.null()) if notnull_hack: column.nullable = True colspec=self.get_column_specification(column,override_nullable=null_hack) @@ -54,7 +54,7 @@ class OracleSchemaChanger(OracleSchemaGenerator,ansisql.ANSISchemaChanger): if notnull_hack: column.nullable = False if dropdefault_hack: - column.default = None + column.server_default = None self.start_alter_table(table_name) self.append("MODIFY ") diff --git a/migrate/changeset/schema.py b/migrate/changeset/schema.py index dfed581..d47de1b 100644 --- a/migrate/changeset/schema.py +++ b/migrate/changeset/schema.py @@ -158,7 +158,7 @@ class _ColumnDelta(dict): diffs = func(*p,**k) self._set_diffs(diffs) # Column attributes that can be altered - diff_keys = ('name','type','nullable','default','primary_key','foreign_key') + diff_keys = ('name','type','nullable','default','server_default','primary_key','foreign_key') def _get_table_name(self): if isinstance(self._table,basestring): @@ -198,7 +198,7 @@ class _ColumnDelta(dict): self.result_column = start_col.copy() self._table = k.pop('table',None) or start_col.table or end_col.table self.current_name = start_col.name - for key in ('name','nullable','default','primary_key','foreign_key'): + for key in ('name','nullable','default','server_default','primary_key','foreign_key'): val = getattr(end_col,key,None) if getattr(start_col,key,None) != val: k.setdefault(key,val) diff --git a/test/changeset/test_changeset.py b/test/changeset/test_changeset.py index d1130dd..70bbb86 100644 --- a/test/changeset/test_changeset.py +++ b/test/changeset/test_changeset.py @@ -57,7 +57,7 @@ class TestAddDropColumn(fixture.DB): _assert_numcols(expected,'database') assert_numcols(1) if len(col_p) == 0: - col_p = [String] + col_p = [String(40)] col = Column(col_name,*col_p,**col_k) create_column_func(col) #create_column(col,self.table) @@ -306,7 +306,7 @@ class TestColumnChange(fixture.DB): @fixture.usedb(supported='sqlite') def test_sqlite_not_supported(self): self.assertRaises(changeset.exceptions.NotSupportedError, - self.table.c.data.alter,default=PassiveDefault('tluafed')) + self.table.c.data.alter,server_default=PassiveDefault('tluafed')) self.assertRaises(changeset.exceptions.NotSupportedError, self.table.c.data.alter,nullable=True) self.assertRaises(changeset.exceptions.NotSupportedError, @@ -398,32 +398,32 @@ class TestColumnChange(fixture.DB): @fixture.usedb(not_supported='sqlite') def test_default(self): - """Can change a column's default value (PassiveDefaults only) + """Can change a column's server_default value (PassiveDefaults only) Only PassiveDefaults are changed here: others are managed by the application / by SA """ #self.engine.echo=True - self.assertEquals(self.table.c.data.default.arg,'tluafed') + self.assertEquals(self.table.c.data.server_default.arg,'tluafed') # Just the new default default = 'my_default' - self.table.c.data.alter(default=PassiveDefault(default)) + self.table.c.data.alter(server_default=PassiveDefault(default)) self.refresh_table(self.table.name) - #self.assertEquals(self.table.c.data.default.arg,default) + #self.assertEquals(self.table.c.data.server_default.arg,default) # TextClause returned by autoload - self.assert_(default in str(self.table.c.data.default.arg)) + self.assert_(default in str(self.table.c.data.server_default.arg)) # Column object default = 'your_default' - self.table.c.data.alter(Column('data',String(40),default=PassiveDefault(default))) + self.table.c.data.alter(Column('data',String(40),server_default=PassiveDefault(default))) self.refresh_table(self.table.name) - self.assert_(default in str(self.table.c.data.default.arg)) + self.assert_(default in str(self.table.c.data.server_default.arg)) # Remove default - self.table.c.data.alter(default=None) + self.table.c.data.alter(server_default=None) self.refresh_table(self.table.name) - # default isn't necessarily None for Oracle - #self.assert_(self.table.c.data.default is None,self.table.c.data.default) + # server_default isn't necessarily None for Oracle + #self.assert_(self.table.c.data.server_default is None,self.table.c.data.server_default) self.engine.execute(self.table.insert(),id=11) row = self.table.select().execute().fetchone() self.assert_(row['data'] is None,row['data']) diff --git a/test/fixture/database.py b/test/fixture/database.py index e416299..574c6cc 100644 --- a/test/fixture/database.py +++ b/test/fixture/database.py @@ -105,7 +105,7 @@ class DB(Base): self.session = create_session(bind=self.engine) if self.level < self.TXN: return - self.txn = self.session.create_transaction() + self.txn = self.session.begin() #self.txn.add(self.engine) def _disconnect(self):