Graphene / GraphQL найти конкретное значение столбца

По какой-то причине я не могу понять, как просто найти определенный фрагмент данных в моей базе данных SQLAlchemy.

В документации по графену-питону просто выполняется этот запрос. чтобы соответствовать идентификатору (который является строкой):

book(id: "Qm9vazow") {
    id
    title
}

Вот мой код Flask-Graphene-SQLAlchemy для моей BookSchema, и я хочу найти конкретный заголовок вместо идентификатора:

class BookModel(db.Model):
    __table__ = db.Model.metadata.tables['books_book']

# Schema Object
class BookSchema(SQLAlchemyObjectType):
    class Meta:
        model = BookModel
        interfaces = (relay.Node, )

# Connection
class BookConnection(relay.Connection):
    class Meta:
        node = BookSchema

# GraphQL query
class Query(graphene.ObjectType):
    node = relay.Node.Field()
    allBooks = SQLAlchemyConnectionField(BookConnection)


schema = graphene.Schema(query=Query, types=[BookSchema])

Когда я запускаю этот запрос, все в порядке и возвращает 3 названия книг:

{
    "query": "{ allBooks(first: 3) { edges { node { title } } } }"
}

Однако, как только я пытаюсь сопоставить конкретный заголовок, он перестает работать. Например:

# I tried all these queries, none worked
1. { allBooks(title: \"some book title\") { edges { node { title } } } }
2. { allBooks(title: \"some book title\") { title }
3. { allBooks(title: 'some book title') { edges { node { title } } } }

Ошибка: "Unknown argument \"title\" on field \"allBooks\" of type \"Query\"."

Должно быть, я делаю небольшую ошибку, которую не вижу, но не могу понять. Я потратил часы, пытаясь понять это.

Вопрос: Как я могу сопоставить заголовок и вернуть объект? Что я делаю неправильно?


person Phillip    schedule 07.07.2019    source источник


Ответы (1)


Догадаться! См. Изменения ниже.

class Query(graphene.ObjectType):
    node = relay.Node.Field()
    all_books = SQLAlchemyConnectionField(BookConnection)

    # Added this
    find_book = graphene.Field(BookSchema, title = graphene.String())

    def resolve_find_book(self, info, title):
      query = BookSchema.get_query(info)
      return query.filter(BookModel.title == title).first()

И мой запрос GraphQL выглядит так:

{
    "query": "{ findBook(title: \"some book title\") { title } }"
}

Надеюсь, это поможет кому-то в будущем!

person Phillip    schedule 07.07.2019
comment
Похоже, это также можно сделать, предоставив параметр filter_fields, как показано в документы - person Daniel Rearden; 07.07.2019
comment
Похоже, это решение будет работать для приложений на основе Django. Я использую Flask для своего - person Phillip; 07.07.2019