diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-10-08 19:47:13 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-10-08 19:47:13 -0400 |
commit | 9df4651fba6d1cd3d2b490f58263cc45a81788f4 (patch) | |
tree | 03289aaa180ca7a5452740a73c2f0e6c9b1979fd | |
parent | 5f07d4b7acc7fee3eb9d9621e0aece96718b902f (diff) | |
download | sqlalchemy-9df4651fba6d1cd3d2b490f58263cc45a81788f4.tar.gz |
Fixed bug where using an annotation such as :func:`.remote` or
:func:`.foreign` on a :class:`.Column` before association with a parent
:class:`.Table` could produce issues related to the parent table not
rendering within joins, due to the inherent copy operation performed
by an annotation. [ticket:2813]
-rw-r--r-- | doc/build/changelog/changelog_08.rst | 11 | ||||
-rw-r--r-- | lib/sqlalchemy/sql/elements.py | 7 | ||||
-rw-r--r-- | test/sql/test_selectable.py | 7 |
3 files changed, 24 insertions, 1 deletions
diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 9e65389ca..87dbc8f93 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -11,6 +11,17 @@ :version: 0.8.3 .. change:: + :tags: bug, orm + :tickets: 2813 + :versions: 0.9.0 + + Fixed bug where using an annotation such as :func:`.remote` or + :func:`.foreign` on a :class:`.Column` before association with a parent + :class:`.Table` could produce issues related to the parent table not + rendering within joins, due to the inherent copy operation performed + by an annotation. + + .. change:: :tags: bug, sql :tickets: 2831 diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 73a8a0b82..2688ef103 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -2466,7 +2466,7 @@ class AnnotatedColumnElement(Annotated): def __init__(self, element, values): Annotated.__init__(self, element, values) ColumnElement.comparator._reset(self) - for attr in ('name', 'key'): + for attr in ('name', 'key', 'table'): if self.__dict__.get(attr, False) is None: self.__dict__.pop(attr) @@ -2481,6 +2481,11 @@ class AnnotatedColumnElement(Annotated): return self._Annotated__element.name @util.memoized_property + def table(self): + """pull 'table' from parent, if not present""" + return self._Annotated__element.table + + @util.memoized_property def key(self): """pull 'key' from parent, if not present""" return self._Annotated__element.key diff --git a/test/sql/test_selectable.py b/test/sql/test_selectable.py index df174fb25..87a226782 100644 --- a/test/sql/test_selectable.py +++ b/test/sql/test_selectable.py @@ -10,6 +10,7 @@ from sqlalchemy.sql import util as sql_util, visitors, expression from sqlalchemy import exc from sqlalchemy.sql import table, column, null from sqlalchemy import util +from sqlalchemy.schema import Column, Table, MetaData metadata = MetaData() table1 = Table('table1', metadata, @@ -1460,6 +1461,12 @@ class AnnotationsTest(fixtures.TestBase): c1.name = 'somename' eq_(c1_a.name, 'somename') + def test_late_table_add(self): + c1 = Column("foo", Integer) + c1_a = c1._annotate({"foo": "bar"}) + t = Table('t', MetaData(), c1) + is_(c1_a.table, t) + def test_custom_constructions(self): from sqlalchemy.schema import Column class MyColumn(Column): |