Skip to content

Commit bc6240d

Browse files
committed
Improved connection resolver from list
1 parent d4ecd50 commit bc6240d

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed

graphene/contrib/sqlalchemy/converter.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,13 @@ def convert_sqlalchemy_relationship(relationship):
1919

2020

2121
def convert_sqlalchemy_column(column):
22-
try:
23-
return convert_sqlalchemy_type(column.type, column)
24-
except Exception:
25-
raise Exception(
26-
"Don't know how to convert the SQLAlchemy field %s (%s)" % (column, column.__class__))
22+
return convert_sqlalchemy_type(getattr(column, 'type', None), column)
2723

2824

2925
@singledispatch
3026
def convert_sqlalchemy_type(type, column):
31-
raise Exception()
27+
raise Exception(
28+
"Don't know how to convert the SQLAlchemy field %s (%s)" % (column, column.__class__))
3229

3330

3431
@convert_sqlalchemy_type.register(types.Date)

graphene/contrib/sqlalchemy/fields.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,25 @@
44
from ...core.types.definitions import List
55
from ...relay import ConnectionField
66
from ...relay.utils import is_node
7-
from .utils import get_type_for_model
7+
from .utils import get_type_for_model, maybe_query, get_query
88

99

1010
class SQLAlchemyConnectionField(ConnectionField):
1111

1212
def __init__(self, *args, **kwargs):
13-
self.session = kwargs.pop('session', None)
1413
return super(SQLAlchemyConnectionField, self).__init__(*args, **kwargs)
1514

1615
@property
1716
def model(self):
1817
return self.type._meta.model
1918

20-
def get_session(self, args, info):
21-
return self.session
22-
2319
def get_query(self, resolved_query, args, info):
24-
self.get_session(args, info)
25-
return resolved_query
20+
return resolved_query or get_query(self.model, info)
2621

2722
def from_list(self, connection_type, resolved, args, info):
28-
qs = self.get_query(resolved, args, info)
29-
return super(SQLAlchemyConnectionField, self).from_list(connection_type, qs, args, info)
23+
query = self.get_query(resolved, args, info)
24+
query = maybe_query(query)
25+
return super(SQLAlchemyConnectionField, self).from_list(connection_type, query, args, info)
3026

3127

3228
class ConnectionOrListField(Field):

graphene/contrib/sqlalchemy/utils.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from sqlalchemy.ext.declarative.api import DeclarativeMeta
2+
from sqlalchemy.orm.query import Query
23

3-
4-
# from sqlalchemy.orm.base import object_mapper
5-
# from sqlalchemy.orm.exc import UnmappedInstanceError
4+
from graphene.utils import LazyList
65

76

87
def get_type_for_model(schema, model):
@@ -20,10 +19,27 @@ def get_session(info):
2019
return schema.options.get('session')
2120

2221

22+
def get_query(model, info):
23+
query = getattr(model, 'query')
24+
if not query:
25+
query = get_session(info).query(model)
26+
return query
27+
28+
29+
class WrappedQuery(LazyList):
30+
31+
def __len__(self):
32+
# Dont calculate the length using len(query), as this will
33+
# evaluate the whole queryset and return it's length.
34+
# Use .count() instead
35+
return self._origin.count()
36+
37+
38+
def maybe_query(value):
39+
if isinstance(value, Query):
40+
return WrappedQuery(value)
41+
return value
42+
43+
2344
def is_mapped(obj):
2445
return isinstance(obj, DeclarativeMeta)
25-
# try:
26-
# object_mapper(obj)
27-
# except UnmappedInstanceError:
28-
# return False
29-
# return True

0 commit comments

Comments
 (0)