Improve get_columns

Add support for columns, column properties and instrumented attributes
This commit is contained in:
Konsta Vesterinen
2015-07-16 18:31:35 +03:00
parent 8213fdba5d
commit 99e1ea0eb2
4 changed files with 26 additions and 4 deletions

View File

@@ -4,6 +4,12 @@ Changelog
Here you can see the full list of changes between each SQLAlchemy-Utils release. Here you can see the full list of changes between each SQLAlchemy-Utils release.
0.30.13 (2015-07-16)
^^^^^^^^^^^^^^^^^^^^
- Added support for InstrumentedAttributes, ColumnProperties and Columns in get_columns function
0.30.12 (2015-07-05) 0.30.12 (2015-07-05)
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^

View File

@@ -377,7 +377,6 @@ from .relationships import (
select_correlated_expression select_correlated_expression
) )
aggregated_attrs = WeakKeyDictionary(defaultdict(list)) aggregated_attrs = WeakKeyDictionary(defaultdict(list))

View File

@@ -403,14 +403,18 @@ def get_columns(mixed):
SA Table object, SA Mapper, SA declarative class, SA declarative class SA Table object, SA Mapper, SA declarative class, SA declarative class
instance or an alias of any of these objects instance or an alias of any of these objects
""" """
if isinstance(mixed, sa.Table): if isinstance(mixed, sa.sql.selectable.Selectable):
return mixed.c return mixed.c
if isinstance(mixed, sa.orm.util.AliasedClass): if isinstance(mixed, sa.orm.util.AliasedClass):
return sa.inspect(mixed).mapper.columns return sa.inspect(mixed).mapper.columns
if isinstance(mixed, sa.sql.selectable.Alias):
return mixed.c
if isinstance(mixed, sa.orm.Mapper): if isinstance(mixed, sa.orm.Mapper):
return mixed.columns return mixed.columns
if isinstance(mixed, InstrumentedAttribute):
return mixed.property.columns
if isinstance(mixed, ColumnProperty):
return mixed.columns
if isinstance(mixed, sa.Column):
return [mixed]
if not isclass(mixed): if not isclass(mixed):
mixed = mixed.__class__ mixed = mixed.__class__
return sa.inspect(mixed).columns return sa.inspect(mixed).columns

View File

@@ -21,6 +21,19 @@ class TestGetColumns(object):
sa.sql.base.ImmutableColumnCollection sa.sql.base.ImmutableColumnCollection
) )
def test_instrumented_attribute(self):
assert get_columns(self.Building.id) == [self.Building.__table__.c._id]
def test_column_property(self):
assert get_columns(self.Building.id.property) == [
self.Building.__table__.c._id
]
def test_column(self):
assert get_columns(self.Building.__table__.c._id) == [
self.Building.__table__.c._id
]
def test_declarative_class(self): def test_declarative_class(self):
assert isinstance( assert isinstance(
get_columns(self.Building), get_columns(self.Building),