Support for many-to-one batch fetching
This commit is contained in:
@@ -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.16.9 (2013-08-21)
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
- Support for many-to-one directed relationship properties batch fetching
|
||||||
|
|
||||||
|
|
||||||
0.16.8 (2013-08-21)
|
0.16.8 (2013-08-21)
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
2
setup.py
2
setup.py
@@ -55,7 +55,7 @@ for name, requirements in extras_require.items():
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='SQLAlchemy-Utils',
|
name='SQLAlchemy-Utils',
|
||||||
version='0.16.8',
|
version='0.16.9',
|
||||||
url='https://github.com/kvesteri/sqlalchemy-utils',
|
url='https://github.com/kvesteri/sqlalchemy-utils',
|
||||||
license='BSD',
|
license='BSD',
|
||||||
author='Konsta Vesterinen',
|
author='Konsta Vesterinen',
|
||||||
|
@@ -37,7 +37,7 @@ from .types import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
__version__ = '0.16.8'
|
__version__ = '0.16.9'
|
||||||
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
@@ -156,7 +156,9 @@ class Fetcher(object):
|
|||||||
self.entities = coordinator.entities
|
self.entities = coordinator.entities
|
||||||
self.first = self.entities[0]
|
self.first = self.entities[0]
|
||||||
self.session = object_session(self.first)
|
self.session = object_session(self.first)
|
||||||
|
self.init_parent_dict()
|
||||||
|
|
||||||
|
def init_parent_dict(self):
|
||||||
self.parent_dict = dict(
|
self.parent_dict = dict(
|
||||||
(self.local_values(entity), [])
|
(self.local_values(entity), [])
|
||||||
for entity in self.entities
|
for entity in self.entities
|
||||||
@@ -237,6 +239,12 @@ class ManyToManyFetcher(Fetcher):
|
|||||||
|
|
||||||
|
|
||||||
class ManyToOneFetcher(Fetcher):
|
class ManyToOneFetcher(Fetcher):
|
||||||
|
def init_parent_dict(self):
|
||||||
|
self.parent_dict = dict(
|
||||||
|
(self.local_values(entity), None)
|
||||||
|
for entity in self.entities
|
||||||
|
)
|
||||||
|
|
||||||
def fetch(self):
|
def fetch(self):
|
||||||
column_name = list(self.prop.remote_side)[0].name
|
column_name = list(self.prop.remote_side)[0].name
|
||||||
|
|
||||||
@@ -248,9 +256,7 @@ class ManyToOneFetcher(Fetcher):
|
|||||||
)
|
)
|
||||||
|
|
||||||
for entity in self.related_entities:
|
for entity in self.related_entities:
|
||||||
self.parent_dict[getattr(entity, column_name)].append(
|
self.parent_dict[getattr(entity, column_name)] = entity
|
||||||
entity
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class OneToManyFetcher(Fetcher):
|
class OneToManyFetcher(Fetcher):
|
||||||
|
@@ -28,17 +28,25 @@ class TestBatchFetchManyToOneRelationships(TestCase):
|
|||||||
|
|
||||||
def setup_method(self, method):
|
def setup_method(self, method):
|
||||||
TestCase.setup_method(self, method)
|
TestCase.setup_method(self, method)
|
||||||
|
self.users = [
|
||||||
|
self.User(id=333, name=u'John'),
|
||||||
|
self.User(id=334, name=u'Matt')
|
||||||
|
]
|
||||||
articles = [
|
articles = [
|
||||||
self.Article(
|
self.Article(
|
||||||
id=1,
|
id=1,
|
||||||
name=u'Article 1',
|
name=u'Article 1',
|
||||||
author=self.User(id=333, name=u'John')
|
author=self.users[0]
|
||||||
),
|
),
|
||||||
self.Article(
|
self.Article(
|
||||||
id=2,
|
id=2,
|
||||||
name=u'Article 2',
|
name=u'Article 2',
|
||||||
author=self.User(id=334, name=u'Matt')
|
author=self.users[1]
|
||||||
),
|
),
|
||||||
|
self.Article(
|
||||||
|
id=3,
|
||||||
|
name=u'Article 3'
|
||||||
|
)
|
||||||
]
|
]
|
||||||
self.session.add_all(articles)
|
self.session.add_all(articles)
|
||||||
self.session.commit()
|
self.session.commit()
|
||||||
@@ -50,6 +58,7 @@ class TestBatchFetchManyToOneRelationships(TestCase):
|
|||||||
'author'
|
'author'
|
||||||
)
|
)
|
||||||
query_count = self.connection.query_count
|
query_count = self.connection.query_count
|
||||||
assert articles[0].author # no lazy load should occur
|
assert articles[0].author == self.users[0] # no lazy load should occur
|
||||||
assert articles[1].author # no lazy load should occur
|
assert articles[1].author == self.users[1] # no lazy load should occur
|
||||||
|
assert articles[2].author is None # no lazy load should occur
|
||||||
assert self.connection.query_count == query_count
|
assert self.connection.query_count == query_count
|
||||||
|
Reference in New Issue
Block a user