在graphene-sqlalchemy查询中按id过滤

问题描述 投票:2回答:3

如何设置graphene-sqlalchemy来按ID过滤对象?

我想运行查询:

{
  marker(markerId: 1) {
    markerId
    title
  }
}

我希望得到一个Marker对象,其中markerId为1,但我得到错误“Unknown argument”markerId“on field”mark“of type”Query“。”

我有两个文件:

schema.朋友

import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType
from model import db_session, Marker as MarkerModel

class Marker(SQLAlchemyObjectType):
    class Meta:
        model = MarkerModel

class Query(graphene.ObjectType):
    marker = graphene.Field(Marker)
    markers = graphene.List(Marker)

    def resolve_markers(self, args, context, info):
        return db_session.query(MarkerModel).all()

    def resolve_marker(self, args, context, info):
        return db_session.query(MarkerModel).first()

schema = graphene.Schema(query=Query)

model.朋友

import sqlalchemy as db
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

from instance.config import settings

engine = db.create_engine(settings["SQLALCHEMY_DATABASE_URI"])
sm = sessionmaker(bind=engine)
db_session = scoped_session(sm)

Base = declarative_base()

Base.query = db_session.query_property()


class Marker(Base):
    __tablename__ = "marker"
    marker_id = db.Column(db.Integer, primary_key=True)
    latitude = db.Column(db.Float)
    longitude = db.Column(db.Float)
    title = db.Column(db.String(100))
    blurb = db.Column(db.String(65535))

    def __repr__(self):
        return "<Marker %d: %s>".format([self.marker_id, self.title])

谢谢你的帮助!

sqlalchemy graphql graphene-python
3个回答
2
投票

可以在https://github.com/somada141/demo-graphql-sqlalchemy-falcon下找到完整的工作演示。

请考虑以下SQLAlchemy ORM类:

class Author(Base, OrmBaseMixin):
    __tablename__ = "authors"

    author_id = sqlalchemy.Column(
        sqlalchemy.types.Integer(),
        primary_key=True,
    )

    name_first = sqlalchemy.Column(
        sqlalchemy.types.Unicode(length=80),
        nullable=False,
    )

    name_last = sqlalchemy.Column(
        sqlalchemy.types.Unicode(length=80),
        nullable=False,
    )

简单地用SQLAlchemyObjectType包裹:

class TypeAuthor(SQLAlchemyObjectType):
    class Meta:
        model = Author

透露:

author = graphene.Field(
    TypeAuthor,
    author_id=graphene.Argument(type=graphene.Int, required=False),
    name_first=graphene.Argument(type=graphene.String, required=False),
    name_last=graphene.Argument(type=graphene.String, required=False),
)

@staticmethod
def resolve_author(
    args,
    info,
    author_id: Union[int, None] = None,
    name_first: Union[str, None] = None,
    name_last: Union[str, None] = None,
):
    query = TypeAuthor.get_query(info=info)

    if author_id:
        query = query.filter(Author.author_id == author_id)

    if name_first:
        query = query.filter(Author.name_first == name_first)

    if name_last:
        query = query.filter(Author.name_last == name_last)

    author = query.first()

    return author

GraphQL查询,例如:

query GetAuthor{
  author(authorId: 1) {
    nameFirst
  }
}

将产生回应:

{
  "data": {
    "author": {
      "nameFirst": "Robert"
    }
  }
}

如您所见,您可以在graphene.Argument实例化期间通过graphene.Field类传递命名参数,这也必须在解析器方法中命名。但是,这两者的组合允许您进行各种过滤。


0
投票

我没有使用过sql-alchemy,但我想你必须为你的模型添加Node接口,如:

class Marker(SQLAlchemyObjectType):
    class Meta:
        model = MarkerModel
        interfaces = (Node,)

0
投票

如果您想通过ID获取对象,可以使用石墨烯继电器。在这种情况下,ID将是中继节点ID,您可以根据您的ID需求进行更改。

你可以在下面的链接中找到一个很好的例子:

https://github.com/alexisrolland/flask-graphene-sqlalchemy

© www.soinside.com 2019 - 2024. All rights reserved.