diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-11-22 10:39:29 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-11-27 20:12:16 -0500 |
commit | 835444be72bb595b1ed3ee5458a86202813412a6 (patch) | |
tree | 4a28b458292860c8739fb481d4c50cd2cf04328d /test/ext/declarative/test_basic.py | |
parent | f39a6216eed6939c29bbea554f8fb84238c84d10 (diff) | |
download | sqlalchemy-835444be72bb595b1ed3ee5458a86202813412a6.tar.gz |
Add __clause_element__ to ColumnProperty
Added a ``__clause_element__()`` method to :class:`.ColumnProperty` which
can allow the usage of a not-fully-declared column or deferred attribute in
a declarative mapped class slightly more friendly when it's used in a
constraint or other column-oriented scenario within the class declaration,
though this still can't work in open-ended expressions; prefer to call the
:attr:`.ColumnProperty.expression` attribute if receiving ``TypeError``.
Fixes: #4372
Change-Id: I5d3d1adb9c77de0566298bc2c46e9001d314b0c7
Diffstat (limited to 'test/ext/declarative/test_basic.py')
-rw-r--r-- | test/ext/declarative/test_basic.py | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/test/ext/declarative/test_basic.py b/test/ext/declarative/test_basic.py index d2dc1a425..68aa9b1f5 100644 --- a/test/ext/declarative/test_basic.py +++ b/test/ext/declarative/test_basic.py @@ -7,11 +7,11 @@ from sqlalchemy import exc import sqlalchemy as sa from sqlalchemy import testing, util from sqlalchemy import MetaData, Integer, String, ForeignKey, \ - ForeignKeyConstraint, Index + ForeignKeyConstraint, Index, UniqueConstraint, CheckConstraint from sqlalchemy.testing.schema import Table, Column from sqlalchemy.orm import relationship, create_session, class_mapper, \ joinedload, configure_mappers, backref, clear_mappers, \ - column_property, composite, Session, properties + column_property, composite, Session, properties, deferred from sqlalchemy.util import with_metaclass from sqlalchemy.ext.declarative import declared_attr, synonym_for from sqlalchemy.testing import fixtures, mock @@ -207,6 +207,53 @@ class DeclarativeTest(DeclarativeTestBase): go ) + def test_using_explicit_prop_in_schema_objects(self): + class Foo(Base): + __tablename__ = 'foo' + + id = Column(Integer, primary_key=True) + cprop = column_property(Column(Integer)) + + __table_args__ = ( + UniqueConstraint(cprop), + ) + uq = [ + c for c in Foo.__table__.constraints + if isinstance(c, UniqueConstraint)][0] + is_(uq.columns.cprop, Foo.__table__.c.cprop) + + class Bar(Base): + __tablename__ = 'bar' + + id = Column(Integer, primary_key=True) + cprop = deferred(Column(Integer)) + + __table_args__ = ( + CheckConstraint(cprop > sa.func.foo()), + ) + ck = [ + c for c in Bar.__table__.constraints + if isinstance(c, CheckConstraint)][0] + is_(ck.columns.cprop, Bar.__table__.c.cprop) + + if testing.requires.python3.enabled: + # test the existing failure case in case something changes + def go(): + class Bat(Base): + __tablename__ = 'bat' + + id = Column(Integer, primary_key=True) + cprop = deferred(Column(Integer)) + + # we still can't do an expression like + # "cprop > 5" because the column property isn't + # a full blown column + + __table_args__ = ( + CheckConstraint(cprop > 5), + ) + assert_raises(TypeError, go) + def test_relationship_level_msg_for_invalid_callable(self): class A(Base): __tablename__ = 'a' |