integrate patch for supporting CheckConstraints by srittau.

Fixes Issue #31
needs a test case
This commit is contained in:
jan.dittberner 2009-01-10 13:11:08 +00:00
parent f1039d3f85
commit 979b8b19dc
2 changed files with 45 additions and 0 deletions

View File

@ -250,6 +250,8 @@ class ANSIConstraintGenerator(ANSIConstraintCommon):
)
ret = "CONSTRAINT %(name)s FOREIGN KEY (%(columns)s) "\
"REFERENCES %(reftable)s (%(referenced)s)"%params
elif isinstance(cons,constraint.CheckConstraint):
ret = "CHECK (%s)"%cons.sqltext
else:
raise exceptions.InvalidConstraintError(cons)
return ret
@ -266,6 +268,9 @@ class ANSIConstraintGenerator(ANSIConstraintCommon):
def visit_migrate_foreign_key_constraint(self,*p,**k):
return self._visit_constraint(*p,**k)
def visit_migrate_check_constraint(self,*p,**k):
return self._visit_constraint(*p,**k)
class ANSIConstraintDropper(ANSIConstraintCommon):
def _visit_constraint(self,constraint):
self.start_alter_table(constraint)
@ -279,6 +284,9 @@ class ANSIConstraintDropper(ANSIConstraintCommon):
def visit_migrate_foreign_key_constraint(self,*p,**k):
return self._visit_constraint(*p,**k)
def visit_migrate_check_constraint(self,*p,**k):
return self._visit_constraint(*p,**k)
class ANSIDialect(object):
columngenerator = ANSIColumnGenerator
columndropper = ANSIColumnDropper

View File

@ -124,3 +124,40 @@ class ForeignKeyConstraint(ConstraintChangeset,schema.ForeignKeyConstraint):
def accept_schema_visitor(self,visitor,*p,**k):
func = 'visit_migrate_foreign_key_constraint'
return self._accept_schema_visitor(visitor,func,*p,**k)
class CheckConstraint(ConstraintChangeset, schema.CheckConstraint):
def __init__(self, sqltext, *args, **kwargs):
cols = kwargs.pop('columns')
colnames, table = self._normalize_columns(cols)
table = kwargs.pop('table', table)
ConstraintChangeset.__init__(self, *args, **kwargs)
schema.CheckConstraint.__init__(self, sqltext, *args, **kwargs)
if table is not None:
self._set_parent(table)
self.colnames = colnames
def _set_parent(self, table):
self.table = table
return super(ConstraintChangeset, self)._set_parent(table)
def create(self):
from migrate.changeset.databases.visitor import get_engine_visitor
visitorcallable = get_engine_visitor(self.table.bind,
'constraintgenerator')
_engine_run_visitor(self.table.bind, visitorcallable, self)
def drop(self):
from migrate.changeset.databases.visitor import get_engine_visitor
visitorcallable = get_engine_visitor(self.table.bind,
'constraintdropper')
_engine_run_visitor(self.table.bind, visitorcallable, self)
self.columns.clear()
return self
def autoname(self):
return "%(table)s_%(cols)s_check" % \
{"table": self.table.name, "cols": "_".join(self.colnames)}
def accept_schema_visitor(self, visitor, *args, **kwargs):
func = 'visit_migrate_check_constraint'
return self._accept_schema_visitor(visitor, func, *args, **kwargs)