如何设置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])
谢谢你的帮助!
可以在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
类传递命名参数,这也必须在解析器方法中命名。但是,这两者的组合允许您进行各种过滤。
我没有使用过sql-alchemy,但我想你必须为你的模型添加Node接口,如:
class Marker(SQLAlchemyObjectType):
class Meta:
model = MarkerModel
interfaces = (Node,)
如果您想通过ID获取对象,可以使用石墨烯继电器。在这种情况下,ID将是中继节点ID,您可以根据您的ID需求进行更改。
你可以在下面的链接中找到一个很好的例子: