summaryrefslogtreecommitdiff
path: root/test/ext/declarative/test_basic.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-11-22 10:39:29 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2018-11-27 20:12:16 -0500
commit835444be72bb595b1ed3ee5458a86202813412a6 (patch)
tree4a28b458292860c8739fb481d4c50cd2cf04328d /test/ext/declarative/test_basic.py
parentf39a6216eed6939c29bbea554f8fb84238c84d10 (diff)
downloadsqlalchemy-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.py51
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'