summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/schema.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-07-14 21:57:51 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-07-14 21:57:51 +0000
commit8889d2c1bc7c527271909c0896e5d053c6aa369e (patch)
treeddc0ff9785eaa62ae5dbd6fadf659f24e859cf39 /lib/sqlalchemy/schema.py
parent44289e375bf0b421dac6eddb8cb072360fe0ad31 (diff)
downloadsqlalchemy-8889d2c1bc7c527271909c0896e5d053c6aa369e.tar.gz
- improved ability to get the "correct" and most minimal set of primary key
columns from a join, equating foreign keys and otherwise equated columns. this is also mostly to help inheritance scenarios formulate the best choice of primary key columns. [ticket:185] - added 'bind' argument to Sequence.create()/drop(), ColumnDefault.execute()
Diffstat (limited to 'lib/sqlalchemy/schema.py')
-rw-r--r--lib/sqlalchemy/schema.py42
1 files changed, 32 insertions, 10 deletions
diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py
index c62ed3373..d9df0da90 100644
--- a/lib/sqlalchemy/schema.py
+++ b/lib/sqlalchemy/schema.py
@@ -59,13 +59,15 @@ class SchemaItem(object):
"""Return the engine or None if no engine."""
if raiseerr:
- e = self._derived_metadata().bind
+ m = self._derived_metadata()
+ e = m and m.bind or None
if e is None:
raise exceptions.InvalidRequestError("This SchemaItem is not connected to any Engine or Connection.")
else:
return e
else:
- return self._derived_metadata().bind
+ m = self._derived_metadata()
+ return m and m.bind or None
def get_engine(self):
"""Return the engine or raise an error if no engine.
@@ -280,7 +282,9 @@ class Table(SchemaItem, sql.TableClause):
self.schema = kwargs.pop('schema', None)
self.indexes = util.Set()
self.constraints = util.Set()
+ self._columns = sql.ColumnCollection()
self.primary_key = PrimaryKeyConstraint()
+ self._foreign_keys = util.OrderedSet()
self.quote = kwargs.pop('quote', False)
self.quote_schema = kwargs.pop('quote_schema', False)
if self.schema is not None:
@@ -298,6 +302,11 @@ class Table(SchemaItem, sql.TableClause):
# store extra kwargs, which should only contain db-specific options
self.kwargs = kwargs
+ def _export_columns(self, columns=None):
+ # override FromClause's collection initialization logic; TableClause and Table
+ # implement it differently
+ pass
+
def _get_case_sensitive_schema(self):
try:
return getattr(self, '_case_sensitive_schema')
@@ -545,6 +554,14 @@ class Column(SchemaItem, sql._ColumnClause):
def _get_engine(self):
return self.table.bind
+ def references(self, column):
+ """return true if this column references the given column via foreign key"""
+ for fk in self.foreign_keys:
+ if fk.column is column:
+ return True
+ else:
+ return False
+
def append_foreign_key(self, fk):
fk._set_parent(self)
@@ -763,7 +780,7 @@ class DefaultGenerator(SchemaItem):
def __init__(self, for_update=False, metadata=None):
self.for_update = for_update
- self._metadata = metadata
+ self._metadata = util.assert_arg_type(metadata, (MetaData, type(None)), 'metadata')
def _derived_metadata(self):
try:
@@ -782,8 +799,10 @@ class DefaultGenerator(SchemaItem):
else:
self.column.default = self
- def execute(self, **kwargs):
- return self._get_engine(raiseerr=True).execute_default(self, **kwargs)
+ def execute(self, bind=None, **kwargs):
+ if bind is None:
+ bind = self._get_engine(raiseerr=True)
+ return bind.execute_default(self, **kwargs)
def __repr__(self):
return "DefaultGenerator()"
@@ -845,12 +864,15 @@ class Sequence(DefaultGenerator):
super(Sequence, self)._set_parent(column)
column.sequence = self
- def create(self):
- self._get_engine(raiseerr=True).create(self)
- return self
+ def create(self, bind=None):
+ if bind is None:
+ bind = self._get_engine(raiseerr=True)
+ bind.create(self)
- def drop(self):
- self._get_engine(raiseerr=True).drop(self)
+ def drop(self, bind=None):
+ if bind is None:
+ bind = self._get_engine(raiseerr=True)
+ bind.drop(self)
def accept_visitor(self, visitor):
"""Call the visit_seauence method on the given visitor."""