diff --git a/CHANGES.rst b/CHANGES.rst index 8adbcaf..d82a1d2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog Here you can see the full list of changes between each SQLAlchemy-Utils release. +0.26.5 (2014-07-xx) +^^^^^^^^^^^^^^^^^^^ + +- Added get_column_key + + 0.26.4 (2014-06-25) ^^^^^^^^^^^^^^^^^^^ diff --git a/docs/orm_helpers.rst b/docs/orm_helpers.rst index 4e5323e..2a35be0 100644 --- a/docs/orm_helpers.rst +++ b/docs/orm_helpers.rst @@ -16,6 +16,12 @@ get_bind .. autofunction:: get_bind +get_column_key +^^^^^^^^^^^^^^ + +.. autofunction:: get_column_key + + get_columns ^^^^^^^^^^^ diff --git a/setup.py b/setup.py index a964156..ba82747 100644 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ for name, requirements in extras_require.items(): setup( name='SQLAlchemy-Utils', - version='0.26.4', + version='0.26.5', url='https://github.com/kvesteri/sqlalchemy-utils', license='BSD', author='Konsta Vesterinen, Ryan Leckey, Janne Vanhala, Vesa Uimonen', diff --git a/sqlalchemy_utils/__init__.py b/sqlalchemy_utils/__init__.py index 1c28403..bab879b 100644 --- a/sqlalchemy_utils/__init__.py +++ b/sqlalchemy_utils/__init__.py @@ -12,6 +12,7 @@ from .functions import ( drop_database, escape_like, get_bind, + get_column_key, get_columns, get_declarative_base, get_mapper, @@ -71,7 +72,7 @@ from .types import ( ) -__version__ = '0.26.4' +__version__ = '0.26.5' __all__ = ( @@ -91,6 +92,7 @@ __all__ = ( generates, generic_relationship, get_bind, + get_column_key, get_columns, get_declarative_base, get_mapper, diff --git a/sqlalchemy_utils/functions/__init__.py b/sqlalchemy_utils/functions/__init__.py index b7e6b89..ba5ebae 100644 --- a/sqlalchemy_utils/functions/__init__.py +++ b/sqlalchemy_utils/functions/__init__.py @@ -20,6 +20,7 @@ from .foreign_keys import ( ) from .orm import ( get_bind, + get_column_key, get_columns, get_declarative_base, get_mapper, diff --git a/sqlalchemy_utils/functions/orm.py b/sqlalchemy_utils/functions/orm.py index 14e6607..9988dad 100644 --- a/sqlalchemy_utils/functions/orm.py +++ b/sqlalchemy_utils/functions/orm.py @@ -17,6 +17,33 @@ from sqlalchemy.orm.session import object_session from sqlalchemy.orm.util import AliasedInsp +def get_column_key(model, column): + """ + Return the key for given column in given model. + + :param model: SQLAlchemy declarative model object + + :: + + class User(Base): + __tablename__ = 'user' + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column('_name', sa.String) + + + get_column_key(User, User.__table__.c.name) # 'name' + + .. versionadded: 0.26.5 + """ + for key, c in sa.inspect(model).columns.items(): + if c is column: + return key + raise ValueError( + "Class %s doesn't have a column 'column.key'", + model.__name__ + ) + + def get_mapper(mixed): """ Return related SQLAlchemy Mapper for given SQLAlchemy object. diff --git a/tests/functions/test_get_column_key.py b/tests/functions/test_get_column_key.py new file mode 100644 index 0000000..8211d28 --- /dev/null +++ b/tests/functions/test_get_column_key.py @@ -0,0 +1,34 @@ +from pytest import raises + +import sqlalchemy as sa +from sqlalchemy.ext.declarative import declarative_base + +from sqlalchemy_utils import get_column_key + + +class TestGetColumnKey(object): + def setup_method(self, method): + Base = declarative_base() + + class Building(Base): + __tablename__ = 'building' + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column('_name', sa.Unicode(255)) + + self.Building = Building + + def test_supports_aliases(self): + assert ( + get_column_key(self.Building, self.Building.__table__.c.id) + == + 'id' + ) + assert ( + get_column_key(self.Building, self.Building.__table__.c._name) + == + 'name' + ) + + def test_throws_value_error_for_unknown_column(self): + with raises(ValueError): + get_column_key(self.Building, 'unknown')