Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NoneType related warnings / errors when using schema.execute() #38

Closed
GeoffreyY opened this issue Nov 10, 2020 · 2 comments
Closed

NoneType related warnings / errors when using schema.execute() #38

GeoffreyY opened this issue Nov 10, 2020 · 2 comments

Comments

@GeoffreyY
Copy link

In some cases when calling a query directly with schema.execute(query_string), I'll get some warning / error message about NoneType. However, when using a flask app instead, I don't receive any error messages on the server side nor the client side.

Full test case

from sqlalchemy import create_engine, Table, Column, Integer, String, ForeignKey
from sqlalchemy.orm import scoped_session, sessionmaker, relationship, backref
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine("sqlite:///:memory:", echo=True)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()

class Song(Base):
    __tablename__ = 'songs'
    song_id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    tags = relationship('Tag',
                        secondary='song_tag_table',
                        backref='songs')

class Tag(Base):
    __tablename__ = 'tags'
    tag_id = Column(Integer, primary_key=True)
    name = Column(String)

class SongTagTable(Base):
    __tablename__ = 'song_tag_table'
    id = Column(Integer, primary_key=True)
    song_id = Column(Integer, ForeignKey('songs.song_id'))
    tag_id = Column(Integer, ForeignKey('tags.tag_id'))

Base.metadata.create_all(engine)

# ==========

from graphene import ObjectType, Schema
from graphene.relay import Connection, Node
from graphene_sqlalchemy import SQLAlchemyObjectType
from graphene_sqlalchemy_filter import FilterableConnectionField, FilterSet

class SongFilter(FilterSet):
    class Meta:
        model = Song
        fields = {'song_id': ['eq', 'ne', 'in']}

class TagFilter(FilterSet):
    class Meta:
        model = Tag
        fields = {'tag_id': ['eq', 'ne', 'in']}

class CustomField(FilterableConnectionField):
    filters = {
        Song: SongFilter(),
        Tag: TagFilter()
    }

class SongNode(SQLAlchemyObjectType):
    class Meta:
        model = Song
        interfaces = (Node,)
        connection_field_factory = CustomField.factory

class TagNode(SQLAlchemyObjectType):
    class Meta:
        model = Tag
        interfaces = (Node,)
        connection_field_factory = CustomField.factory

class SongConnection(Connection):
    class Meta:
        node = SongNode

class TagConnection(Connection):
    class Meta:
        node = TagNode

class Query(ObjectType):
    all_songs = CustomField(SongConnection)
    all_tags = CustomField(TagConnection)

schema = Schema(query=Query)

# ==========

jpop = Tag(name='jpop')

subarashi = Song(name='素晴らしい日々')
subarashi.tags.append(jpop)
db_session.add(subarashi)

fool_in_tank = Song(name='水槽のフール')
fool_in_tank.tags.append(jpop)
db_session.add(fool_in_tank)

despacito = Song(name='despacito')
db_session.add(despacito)
db_session.commit()

# ==========

query_string = """
insert test query here
"""
res = schema.execute(query_string)
print(res)

Normal test case, no errors

query_string = """
query {
  allSongs {
    edges {
      node {
        name
      }
    }
  }
}
"""

response (normal):

{'data': {'allSongs': {'edges': [{'node': {'name': '素晴らしい日々'}}, {'node': {'name': '水槽のフール'}}, {'node': {'name': 'despacito'}}]}}}

Testing filtering, runtime warning

query_string = """
query {
  allSongs(filters: {songIdNe: 2}) {
    edges {
      node {
        name
      }
    }
  }
}
"""

response (normal):

{'data': {'allSongs': {'edges': [{'node': {'name': '素晴らしい日々'}}, {'node': {'name': 'despacito'}}]}}}

warning:

c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\filters.py:750: RuntimeWarning: Graphene-SQLAlchemy-Filter: info.context has an unsupported type <class 'NoneType'>. Now cls.aliased(info, ...) is not supported. Allowed types: dict and object with __dict__ attribute.
  warnings.warn(msg, RuntimeWarning)

Large error

query_string = """
query {
  allSongs {
    edges {
      node {
        name
        tags {
          edges {
            node {
              name
            }
          }
        }
      }
    }
  }
}
"""

response:

{'errors': [{'message': "'NoneType' object has no attribute '_sqla_filter_dataloaders'", 'locations': [{'line': 7, 'column': 9}], 'path': ['allSongs', 'edges', 0, 'node', 'tags']}, {'message': "'NoneType' object has no attribute '_sqla_filter_dataloaders'", 'locations': [{'line': 7, 'column': 9}], 'path': ['allSongs', 'edges', 1, 'node', 'tags']}, {'message': "'NoneType' object has no attribute '_sqla_filter_dataloaders'", 'locations': [{'line': 7, 'column': 9}], 'path': ['allSongs', 'edges', 2, 'node', 'tags']}], 'data': {'allSongs': {'edges': [{'node': {'name': '素晴らしい日々', 'tags': None}}, {'node': {'name': '水槽のフール', 'tags': None}}, {'node': {'name': 'despacito', 'tags': None}}]}}}

error:

An error occurred while resolving field SongNode.tags
Traceback (most recent call last):
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executor.py", line 452, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executors\sync.py", line 16, in execute
    return fn(*args, **kwargs)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 356, in connection_resolver
    data_loader: ModelLoader = cls._get_or_create_data_loader(
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 318, in _get_or_create_data_loader
    setattr(info.context, cls.dataloaders_field, data_loaders)
AttributeError: 'NoneType' object has no attribute '_sqla_filter_dataloaders'
Traceback (most recent call last):
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executor.py", line 452, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executors\sync.py", line 16, in execute
    return fn(*args, **kwargs)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 356, in connection_resolver
    data_loader: ModelLoader = cls._get_or_create_data_loader(
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 318, in _get_or_create_data_loader
    setattr(info.context, cls.dataloaders_field, data_loaders)
graphql.error.located_error.GraphQLLocatedError: 'NoneType' object has no attribute '_sqla_filter_dataloaders'

An error occurred while resolving field SongNode.tags
Traceback (most recent call last):
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executor.py", line 452, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executors\sync.py", line 16, in execute
    return fn(*args, **kwargs)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 356, in connection_resolver
    data_loader: ModelLoader = cls._get_or_create_data_loader(
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 318, in _get_or_create_data_loader
    setattr(info.context, cls.dataloaders_field, data_loaders)
AttributeError: 'NoneType' object has no attribute '_sqla_filter_dataloaders'
Traceback (most recent call last):
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executor.py", line 452, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executors\sync.py", line 16, in execute
    return fn(*args, **kwargs)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 356, in connection_resolver
    data_loader: ModelLoader = cls._get_or_create_data_loader(
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 318, in _get_or_create_data_loader
    setattr(info.context, cls.dataloaders_field, data_loaders)
graphql.error.located_error.GraphQLLocatedError: 'NoneType' object has no attribute '_sqla_filter_dataloaders'

An error occurred while resolving field SongNode.tags
Traceback (most recent call last):
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executor.py", line 452, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executors\sync.py", line 16, in execute
    return fn(*args, **kwargs)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 356, in connection_resolver
    data_loader: ModelLoader = cls._get_or_create_data_loader(
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 318, in _get_or_create_data_loader
    setattr(info.context, cls.dataloaders_field, data_loaders)
AttributeError: 'NoneType' object has no attribute '_sqla_filter_dataloaders'
Traceback (most recent call last):
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executor.py", line 452, in resolve_or_error
    return executor.execute(resolve_fn, source, info, **args)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphql\execution\executors\sync.py", line 16, in execute
    return fn(*args, **kwargs)
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 356, in connection_resolver
    data_loader: ModelLoader = cls._get_or_create_data_loader(
  File "c:\users\geoffrey\appdata\local\programs\python\python38\lib\site-packages\graphene_sqlalchemy_filter\connection_field.py", line 318, in _get_or_create_data_loader
    setattr(info.context, cls.dataloaders_field, data_loaders)
graphql.error.located_error.GraphQLLocatedError: 'NoneType' object has no attribute '_sqla_filter_dataloaders'

library versions:

python: 3.8.0
sqlalchemy: 1.3.20
graphene: 2.1.8
graphene_sqlalchemy: 2.3.0
graphene_sqlalchemy_filter: 1.12.1

I'm new to both sqlalchemy and graphql, so hopefully I didn't make any trivial mistakes. Thanks!

@kushalmittal
Copy link

kushalmittal commented Jan 12, 2021

@GeoffreyY I am facing the same error. Were you able to resolve it?
@art1415926535 is this something that is known?

@art1415926535
Copy link
Owner

Hi. Request requires context with session

execution_result = schema.execute(
request_string, context={'session': session}
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants