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)
|
self._run_subvisit(delta,self._visit_column_type)
|
||||||
if 'nullable' in keys:
|
if 'nullable' in keys:
|
||||||
self._run_subvisit(delta,self._visit_column_nullable)
|
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)
|
self._run_subvisit(delta,self._visit_column_default)
|
||||||
#if 'primary_key' in keys:
|
#if 'primary_key' in keys:
|
||||||
# #self._run_subvisit(delta,self._visit_column_primary_key)
|
# #self._run_subvisit(delta,self._visit_column_primary_key)
|
||||||
@ -172,14 +173,9 @@ class ANSISchemaChanger(AlterTableVisitor,SchemaGenerator):
|
|||||||
else:
|
else:
|
||||||
self.append("SET NOT NULL")
|
self.append("SET NOT NULL")
|
||||||
def _visit_column_default(self,table_name,col_name,delta):
|
def _visit_column_default(self,table_name,col_name,delta):
|
||||||
default = delta['default']
|
server_default = delta['server_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
|
|
||||||
# Dummy column: get_col_default_string needs a column for some reason
|
# 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)
|
default_text = self.get_column_default_string(dummy)
|
||||||
self.start_alter_table(table_name)
|
self.start_alter_table(table_name)
|
||||||
self.append("ALTER COLUMN %s "%col_name)
|
self.append("ALTER COLUMN %s "%col_name)
|
||||||
|
@ -13,7 +13,7 @@ class MySQLSchemaChanger(MySQLSchemaGenerator,ansisql.ANSISchemaChanger):
|
|||||||
keys = delta.keys()
|
keys = delta.keys()
|
||||||
if 'type' in keys or 'nullable' in keys or 'name' in keys:
|
if 'type' in keys or 'nullable' in keys or 'name' in keys:
|
||||||
self._run_subvisit(delta,self._visit_column_change)
|
self._run_subvisit(delta,self._visit_column_change)
|
||||||
if 'default' in keys:
|
if 'server_default' in keys:
|
||||||
# Column name might have changed above
|
# Column name might have changed above
|
||||||
col_name = delta.get('name',delta.current_name)
|
col_name = delta.get('name',delta.current_name)
|
||||||
self._run_subvisit(delta,self._visit_column_default,col_name=col_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):
|
def visit_column(self,delta):
|
||||||
keys = delta.keys()
|
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)
|
self._run_subvisit(delta,self._visit_column_change)
|
||||||
if 'name' in keys:
|
if 'name' in keys:
|
||||||
self._run_subvisit(delta,self._visit_column_name)
|
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.
|
# Oracle cannot drop a default once created, but it can set it to null.
|
||||||
# We'll do that if default=None
|
# We'll do that if default=None
|
||||||
# http://forums.oracle.com/forums/message.jspa?messageID=1273234#1273234
|
# 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
|
# 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
|
# 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()))
|
notnull_hack = ((not column.nullable) and ('nullable' not in delta.keys()))
|
||||||
@ -45,7 +45,7 @@ class OracleSchemaChanger(OracleSchemaGenerator,ansisql.ANSISchemaChanger):
|
|||||||
|
|
||||||
|
|
||||||
if dropdefault_hack:
|
if dropdefault_hack:
|
||||||
column.default = sa.PassiveDefault(sa.sql.null())
|
column.server_default = sa.PassiveDefault(sa.sql.null())
|
||||||
if notnull_hack:
|
if notnull_hack:
|
||||||
column.nullable = True
|
column.nullable = True
|
||||||
colspec=self.get_column_specification(column,override_nullable=null_hack)
|
colspec=self.get_column_specification(column,override_nullable=null_hack)
|
||||||
@ -54,7 +54,7 @@ class OracleSchemaChanger(OracleSchemaGenerator,ansisql.ANSISchemaChanger):
|
|||||||
if notnull_hack:
|
if notnull_hack:
|
||||||
column.nullable = False
|
column.nullable = False
|
||||||
if dropdefault_hack:
|
if dropdefault_hack:
|
||||||
column.default = None
|
column.server_default = None
|
||||||
|
|
||||||
self.start_alter_table(table_name)
|
self.start_alter_table(table_name)
|
||||||
self.append("MODIFY ")
|
self.append("MODIFY ")
|
||||||
|
@ -158,7 +158,7 @@ class _ColumnDelta(dict):
|
|||||||
diffs = func(*p,**k)
|
diffs = func(*p,**k)
|
||||||
self._set_diffs(diffs)
|
self._set_diffs(diffs)
|
||||||
# Column attributes that can be altered
|
# 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):
|
def _get_table_name(self):
|
||||||
if isinstance(self._table,basestring):
|
if isinstance(self._table,basestring):
|
||||||
@ -198,7 +198,7 @@ class _ColumnDelta(dict):
|
|||||||
self.result_column = start_col.copy()
|
self.result_column = start_col.copy()
|
||||||
self._table = k.pop('table',None) or start_col.table or end_col.table
|
self._table = k.pop('table',None) or start_col.table or end_col.table
|
||||||
self.current_name = start_col.name
|
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)
|
val = getattr(end_col,key,None)
|
||||||
if getattr(start_col,key,None) != val:
|
if getattr(start_col,key,None) != val:
|
||||||
k.setdefault(key,val)
|
k.setdefault(key,val)
|
||||||
|
@ -57,7 +57,7 @@ class TestAddDropColumn(fixture.DB):
|
|||||||
_assert_numcols(expected,'database')
|
_assert_numcols(expected,'database')
|
||||||
assert_numcols(1)
|
assert_numcols(1)
|
||||||
if len(col_p) == 0:
|
if len(col_p) == 0:
|
||||||
col_p = [String]
|
col_p = [String(40)]
|
||||||
col = Column(col_name,*col_p,**col_k)
|
col = Column(col_name,*col_p,**col_k)
|
||||||
create_column_func(col)
|
create_column_func(col)
|
||||||
#create_column(col,self.table)
|
#create_column(col,self.table)
|
||||||
@ -306,7 +306,7 @@ class TestColumnChange(fixture.DB):
|
|||||||
@fixture.usedb(supported='sqlite')
|
@fixture.usedb(supported='sqlite')
|
||||||
def test_sqlite_not_supported(self):
|
def test_sqlite_not_supported(self):
|
||||||
self.assertRaises(changeset.exceptions.NotSupportedError,
|
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.assertRaises(changeset.exceptions.NotSupportedError,
|
||||||
self.table.c.data.alter,nullable=True)
|
self.table.c.data.alter,nullable=True)
|
||||||
self.assertRaises(changeset.exceptions.NotSupportedError,
|
self.assertRaises(changeset.exceptions.NotSupportedError,
|
||||||
@ -398,32 +398,32 @@ class TestColumnChange(fixture.DB):
|
|||||||
|
|
||||||
@fixture.usedb(not_supported='sqlite')
|
@fixture.usedb(not_supported='sqlite')
|
||||||
def test_default(self):
|
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
|
Only PassiveDefaults are changed here: others are managed by the
|
||||||
application / by SA
|
application / by SA
|
||||||
"""
|
"""
|
||||||
#self.engine.echo=True
|
#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
|
# Just the new default
|
||||||
default = 'my_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.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
|
# 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
|
# Column object
|
||||||
default = 'your_default'
|
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.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
|
# Remove default
|
||||||
self.table.c.data.alter(default=None)
|
self.table.c.data.alter(server_default=None)
|
||||||
self.refresh_table(self.table.name)
|
self.refresh_table(self.table.name)
|
||||||
# default isn't necessarily None for Oracle
|
# server_default isn't necessarily None for Oracle
|
||||||
#self.assert_(self.table.c.data.default is None,self.table.c.data.default)
|
#self.assert_(self.table.c.data.server_default is None,self.table.c.data.server_default)
|
||||||
self.engine.execute(self.table.insert(),id=11)
|
self.engine.execute(self.table.insert(),id=11)
|
||||||
row = self.table.select().execute().fetchone()
|
row = self.table.select().execute().fetchone()
|
||||||
self.assert_(row['data'] is None,row['data'])
|
self.assert_(row['data'] is None,row['data'])
|
||||||
|
@ -105,7 +105,7 @@ class DB(Base):
|
|||||||
self.session = create_session(bind=self.engine)
|
self.session = create_session(bind=self.engine)
|
||||||
if self.level < self.TXN:
|
if self.level < self.TXN:
|
||||||
return
|
return
|
||||||
self.txn = self.session.create_transaction()
|
self.txn = self.session.begin()
|
||||||
#self.txn.add(self.engine)
|
#self.txn.add(self.engine)
|
||||||
|
|
||||||
def _disconnect(self):
|
def _disconnect(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user