add support for SA 0.5
This commit is contained in:
parent
aba0f50681
commit
f687cd3fe0
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 ")
|
||||
|
@ -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)
|
||||
|
@ -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'])
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user