По какой-то причине я не могу понять, как просто найти определенный фрагмент данных в моей базе данных 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\"."
Должно быть, я делаю небольшую ошибку, которую не вижу, но не могу понять. Я потратил часы, пытаясь понять это.
Вопрос: Как я могу сопоставить заголовок и вернуть объект? Что я делаю неправильно?





Догадаться! См. изменения ниже.
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 } }"
}
Надеюсь, это поможет кому-то в будущем!
Похоже, это решение будет работать для приложений на основе Django. Я использую Flask для себя
Похоже, это также должно быть выполнимо, если указать параметр
filter_fields, как показано в документы.