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
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_
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)
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):