[Sqlalchemy-commits] sqlalchemy: - relationships and columns with foreign keys aren't
Brought to you by:
zzzeek
From: <co...@sq...> - 2010-03-27 03:14:36
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/a848720aab42 changeset: 6388:a848720aab42 user: zzzeek date: Fri Mar 26 23:14:16 2010 -0400 description: - relationships and columns with foreign keys aren't allowed on declarative mixins, sorry. [ticket:1751] diffstat: CHANGES | 3 +++ lib/sqlalchemy/ext/declarative.py | 13 +++++++++++-- test/ext/test_declarative.py | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diffs (79 lines): diff -r f8e95cc3e9d7 -r a848720aab42 CHANGES --- a/CHANGES Fri Mar 26 14:57:01 2010 -0600 +++ b/CHANGES Fri Mar 26 23:14:16 2010 -0400 @@ -97,6 +97,9 @@ __tablename__, __table_args__, etc. now works if the method references attributes on the ultimate subclass. [ticket:1749] + + - relationships and columns with foreign keys aren't + allowed on declarative mixins, sorry. [ticket:1751] 0.6beta2 ======== diff -r f8e95cc3e9d7 -r a848720aab42 lib/sqlalchemy/ext/declarative.py --- a/lib/sqlalchemy/ext/declarative.py Fri Mar 26 14:57:01 2010 -0600 +++ b/lib/sqlalchemy/ext/declarative.py Fri Mar 26 23:14:16 2010 -0400 @@ -507,7 +507,7 @@ from sqlalchemy.schema import Table, Column, MetaData from sqlalchemy.orm import synonym as _orm_synonym, mapper, comparable_property, class_mapper from sqlalchemy.orm.interfaces import MapperProperty -from sqlalchemy.orm.properties import PropertyLoader, ColumnProperty +from sqlalchemy.orm.properties import RelationshipProperty, ColumnProperty from sqlalchemy.orm.util import _is_mapped_class from sqlalchemy import util, exceptions from sqlalchemy.sql import util as sql_util @@ -543,7 +543,16 @@ for name in names: obj = getattr(base,name, None) if isinstance(obj, Column): + if obj.foreign_keys: + raise exceptions.InvalidRequestError( + "Columns with foreign keys to other columns " + "are not allowed on declarative mixins at this time." + ) dict_[name]=column_copies[obj]=obj.copy() + elif isinstance(obj, RelationshipProperty): + raise exceptions.InvalidRequestError( + "relationships are not allowed on " + "declarative mixins at this time.") # doing it this way enables these attributes to be descriptors get_mapper_args = '__mapper_args__' in dict_ @@ -778,7 +787,7 @@ prop.parent, arg, n.args[0], cls)) return return_cls - if isinstance(prop, PropertyLoader): + if isinstance(prop, RelationshipProperty): for attr in ('argument', 'order_by', 'primaryjoin', 'secondaryjoin', 'secondary', '_foreign_keys', 'remote_side'): v = getattr(prop, attr) diff -r f8e95cc3e9d7 -r a848720aab42 test/ext/test_declarative.py --- a/test/ext/test_declarative.py Fri Mar 26 14:57:01 2010 -0600 +++ b/test/ext/test_declarative.py Fri Mar 26 23:14:16 2010 -0400 @@ -1914,6 +1914,24 @@ eq_(obj.name,'testing') eq_(obj.foo(),'bar1') eq_(obj.baz,'fu') + + def test_not_allowed(self): + class MyMixin: + foo = Column(Integer, ForeignKey('bar.id')) + + def go(): + class MyModel(Base, MyMixin): + __tablename__ = 'foo' + + assert_raises(sa.exc.InvalidRequestError, go) + + class MyRelMixin: + foo = relationship("Bar") + def go(): + class MyModel(Base, MyRelMixin): + __tablename__ = 'foo' + assert_raises(sa.exc.InvalidRequestError, go) + def test_table_name_inherited(self): |