Add get_referencing_foreign_keys

This commit is contained in:
Konsta Vesterinen
2014-04-28 15:56:23 +03:00
parent efe24b89c1
commit 88690ea83e
6 changed files with 46 additions and 1 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.25.5 (2014-xx-xx)
^^^^^^^^^^^^^^^^^^^
- Added get_referencing_foreign_keys
0.25.4 (2014-04-22) 0.25.4 (2014-04-22)
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^

View File

@@ -28,6 +28,12 @@ get_primary_keys
.. autofunction:: primary_keys .. autofunction:: primary_keys
get_referencing_foreign_keys
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. autofunction:: get_referencing_foreign_keys
query_entities query_entities
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^

View File

@@ -13,6 +13,7 @@ from .functions import (
get_columns, get_columns,
get_declarative_base, get_declarative_base,
get_primary_keys, get_primary_keys,
get_referencing_foreign_keys,
identity, identity,
mock_engine, mock_engine,
naturally_equivalent, naturally_equivalent,
@@ -80,6 +81,7 @@ __all__ = (
get_columns, get_columns,
get_declarative_base, get_declarative_base,
get_primary_keys, get_primary_keys,
get_referencing_foreign_keys,
identity, identity,
instrumented_list, instrumented_list,
merge, merge,

View File

@@ -15,6 +15,7 @@ from .orm import (
get_columns, get_columns,
get_declarative_base, get_declarative_base,
get_primary_keys, get_primary_keys,
get_referencing_foreign_keys,
getdotattr, getdotattr,
has_changes, has_changes,
identity, identity,
@@ -33,6 +34,7 @@ __all__ = (
'get_columns', 'get_columns',
'get_declarative_base', 'get_declarative_base',
'get_primary_keys', 'get_primary_keys',
'get_referencing_foreign_keys',
'getdotattr', 'getdotattr',
'has_changes', 'has_changes',
'identity', 'identity',

View File

@@ -14,6 +14,35 @@ from sqlalchemy.orm.query import _ColumnEntity
from sqlalchemy.orm.util import AliasedInsp from sqlalchemy.orm.util import AliasedInsp
def get_referencing_foreign_keys(mixed):
"""
Returns referencing foreign keys for given Table object or declarative
class.
:param mixed:
SA Table object or SA declarative class
::
get_foreign_keys(User) # set([ForeignKey('user.id')])
"""
if isinstance(mixed, sa.Table):
tables = [mixed]
else:
# TODO: make this support joined table inheritance
tables = [mixed.__table__]
referencing_foreign_keys = set()
for table in mixed.metadata.tables.values():
for constraint in table.constraints:
if isinstance(constraint, sa.sql.schema.ForeignKeyConstraint):
for fk in constraint.elements:
if any(fk.references(t) for t in tables):
referencing_foreign_keys.add(fk)
return referencing_foreign_keys
def get_primary_keys(mixed): def get_primary_keys(mixed):
""" """
Return an OrderedDict of all primary keys for given Table object, Return an OrderedDict of all primary keys for given Table object,

View File

@@ -38,7 +38,7 @@ class TestCase(object):
def setup_method(self, method): def setup_method(self, method):
self.engine = create_engine(self.dns) self.engine = create_engine(self.dns)
self.engine.echo = True # self.engine.echo = True
self.connection = self.engine.connect() self.connection = self.engine.connect()
self.Base = declarative_base() self.Base = declarative_base()