summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/sql/schema.py
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2019-11-26 18:06:45 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2019-11-26 18:06:45 +0000
commit06b0892da049a995ee4cd1e7cc3c1eb68f3dde64 (patch)
tree012ede76b812efe0fd65aeffda229fca3fa82c26 /lib/sqlalchemy/sql/schema.py
parentc5d23203b24f48c25eb17284f023f9f30151a229 (diff)
parentf7fe966a4c40fbe98e6321d275ffee8f898a211b (diff)
downloadsqlalchemy-06b0892da049a995ee4cd1e7cc3c1eb68f3dde64.tar.gz
Merge "Remove ORM elements from annotations at the schema level."
Diffstat (limited to 'lib/sqlalchemy/sql/schema.py')
-rw-r--r--lib/sqlalchemy/sql/schema.py78
1 files changed, 29 insertions, 49 deletions
diff --git a/lib/sqlalchemy/sql/schema.py b/lib/sqlalchemy/sql/schema.py
index c7d699a5f..44c8499b8 100644
--- a/lib/sqlalchemy/sql/schema.py
+++ b/lib/sqlalchemy/sql/schema.py
@@ -1721,21 +1721,14 @@ class ForeignKey(DialectKWArgs, SchemaItem):
"""
- self._colspec = column
+ self._colspec = coercions.expect(roles.DDLReferredColumnRole, column)
+
if isinstance(self._colspec, util.string_types):
self._table_column = None
else:
- if hasattr(self._colspec, "__clause_element__"):
- self._table_column = self._colspec.__clause_element__()
- else:
- self._table_column = self._colspec
+ self._table_column = self._colspec
- if not isinstance(self._table_column, ColumnClause):
- raise exc.ArgumentError(
- "String, Column, or Column-bound argument "
- "expected, got %r" % self._table_column
- )
- elif not isinstance(
+ if not isinstance(
self._table_column.table, (util.NoneType, TableClause)
):
raise exc.ArgumentError(
@@ -2692,25 +2685,6 @@ class Constraint(DialectKWArgs, SchemaItem):
raise NotImplementedError()
-def _to_schema_column(element):
- if hasattr(element, "__clause_element__"):
- element = element.__clause_element__()
- if not isinstance(element, Column):
- raise exc.ArgumentError("schema.Column object expected")
- return element
-
-
-def _to_schema_column_or_string(element):
- if element is None:
- return element
- elif hasattr(element, "__clause_element__"):
- element = element.__clause_element__()
- if not isinstance(element, util.string_types + (ColumnElement,)):
- msg = "Element %r is not a string name or column element"
- raise exc.ArgumentError(msg % element)
- return element
-
-
class ColumnCollectionMixin(object):
columns = None
@@ -2727,9 +2701,26 @@ class ColumnCollectionMixin(object):
_autoattach = kw.pop("_autoattach", True)
self._column_flag = kw.pop("_column_flag", False)
self.columns = DedupeColumnCollection()
- self._pending_colargs = [
- _to_schema_column_or_string(c) for c in columns
- ]
+
+ processed_expressions = kw.pop("_gather_expressions", None)
+ if processed_expressions is not None:
+ self._pending_colargs = []
+ for (
+ expr,
+ column,
+ strname,
+ add_element,
+ ) in coercions.expect_col_expression_collection(
+ roles.DDLConstraintColumnRole, columns
+ ):
+ self._pending_colargs.append(add_element)
+ processed_expressions.append(expr)
+ else:
+ self._pending_colargs = [
+ coercions.expect(roles.DDLConstraintColumnRole, column)
+ for column in columns
+ ]
+
if _autoattach and self._pending_colargs:
self._check_attach()
@@ -2917,7 +2908,6 @@ class CheckConstraint(ColumnCollectionConstraint):
"""
self.sqltext = coercions.expect(roles.DDLExpressionRole, sqltext)
-
columns = []
visitors.traverse(self.sqltext, {}, {"column": columns.append})
@@ -3576,20 +3566,6 @@ class Index(DialectKWArgs, ColumnCollectionMixin, SchemaItem):
"""
self.table = table = None
- columns = []
- processed_expressions = []
- for (
- expr,
- column,
- strname,
- add_element,
- ) in coercions.expect_col_expression_collection(
- roles.DDLConstraintColumnRole, expressions
- ):
- columns.append(add_element)
- processed_expressions.append(expr)
-
- self.expressions = processed_expressions
self.name = quoted_name(name, kw.pop("quote", None))
self.unique = kw.pop("unique", False)
_column_flag = kw.pop("_column_flag", False)
@@ -3603,10 +3579,14 @@ class Index(DialectKWArgs, ColumnCollectionMixin, SchemaItem):
self._validate_dialect_kwargs(kw)
+ self.expressions = []
# will call _set_parent() if table-bound column
# objects are present
ColumnCollectionMixin.__init__(
- self, *columns, _column_flag=_column_flag
+ self,
+ *expressions,
+ _column_flag=_column_flag,
+ _gather_expressions=self.expressions
)
if table is not None: