处理sqlalchemy的graphql扩展
sqlalchemy_graphql的Python项目详细描述
sqlalchemy graphql是graphql epoxy的插件,它为 用于graphql的sqlalchemy模型
石墨烯支持即将推出
安装
SQLAlchemy Sphinx在pypi上的包名下可用 sqlalchemy-graphql,您可以通过运行以下命令获取:
pip install sqlalchemy-graphql
用法
第一步是注册类型注册表。这会将所有功能添加到 不用你做任何工作就可以注册。它利用了graphql别名。
fromepoxyimportTypeRegistryfromsqlalchemy_graphql.epoxyimportEpoxySQLAlchemyR=TypeRegistry()esql=EpoxySQLAlchemy()esql.register(R)
完成后,注册表现在有一个名为funcbase的新接口,它将是 接口所有GraphQL模型都将使用。
在这里,我们将使用epoxy的注册表装饰器定义sqlalchemy模型。
fromsqlalchemyimportcreate_engine,Column,Integer,String,ForeignKeyfromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy.ormimportrelationship,backref,sessionmakerfromyoue_applicationimportRengine=create_engine('sqlite:///:memory:',echo=True)Base=declarative_base(bind=engine)Session=sessionmaker(bind=engine)session=Session()@R.ParentModel.CanBeclassParentModel(Base):__tablename__="parents"id=Column(Integer,primary_key=True)name=Column(String)@R.ChildModel.CanBeclassChildModel(Base):__tablename__="children"id=Column(Integer,primary_key=True)name=Column(String)parent_id=Column(Integer,ForeignKey("parents.id"),nullable=False)parent=relationship("ParentModel",backref=backref("children",lazy="dynamic",cascade="all,delete-orphan"))
最后定义GraphQL模型
首先需要做的是在任何关系或sqlalchemy模型查询期间,我们需要 包括esql.quey_参数。我在下面创建了一个全局变量,但是您可以随意添加它们。
fromyour_applicationimportR,esqlfromyour_application.your_sqlalchemy_modelsimportChildModelasBaseChildModel,ParentModelasBaseParentModel,sessionfromsqlalchemy_graphql.epoxy.utilsimportadd_query_argsfromsqlalchemy_graphql.epoxy.queryimportresolve_sqlalchemymodel_args=add_query_args({"id":R.Int,"name":R.String,"ids":R.Int.List},esql.query_args)classParentModel(R.Implements.FuncBase):id=R.Intname=R.Stringchildren=R.ChildModel.List(args=model_args)defresolve_children(self,obj,args,info):returnresolve_sqlalchemy(obj,args,info,BaseChildModel,query=obj.children)classChildModel(R.Implements.FuncBase):id=R.Intname=R.Stringparent=R.ParentModel(args=model_args)defresolve_parent(self,obj,args,info):returnresolve_sqlalchemy(obj,args,info,BaseParentModel,query=obj.parent)classQuery(R.ObjectType):parent_model=R.ParentModel(args=model_args)child_model=R.ChildModel(args=model_args)parent_models=R.ParentModel.List(args=model_args)child_models=R.ChildModel.List(args=model_args)defresolve_parent_model(self,obj,args,info):query=session.query(BaseParentModel)returnresolve_sqlalchemy(obj,args,info,BaseParentModel,query=query,single=True)defresolve_child_model(self,obj,args,info):query=session.query(BaseChildModel)returnresolve_sqlalchemy(obj,args,info,BaseChildModel,query=query,single=True)defresolve_parent_models(self,obj,args,info):query=session.query(BaseParentModel)returnresolve_sqlalchemy(obj,args,info,BaseParentModel,query=query)defresolve_child_models(self,obj,args,info):query=session.query(BaseChildModel)returnresolve_sqlalchemy(obj,args,info,BaseChildModel))
您会注意到,在查询的解析中,我们使用帮助函数resolve_sqlalchemy,由sqlalchemy graphql提供,来解析将要使用的任何查询参数
需要传入的只是一个基本查询,它将sqlalchemy模型作为第一个参数, 你可以走了。
示例
提供的测试有很多例子, 但这里有一些基本的查询,你现在可以用你的万能函数。
实际上,您可以执行sqlalchemy func提供的任何操作
基本格式是:
func(field:"{YOUR TARGET ATTRIBUTE}",op:"YOUR OPERATION")func(field:"id",op:"min")}func(field:"id",op:"max")}func(field:"count",op:"sum")}
test_parent_1=ParentModel(name="Adriel")test_parent_2=ParentModel(name="Carolina")session.add(test_parent_1)session.add(test_parent_2)session.commit()schema=R.Schema(R.Query)query='{parentModel {idSum: func(field:"id", op:"sum")}}'results=graphql(schema,query)value=test_parent_1.id+test_parent_2.idassertresults.data['parentModel']['idSum']==valuequery='{parentModels {distinctName: count(distinct:"name")}}'results=graphql(schema,query)# results.data == {'parentModels': [{'distinctName': 2}]}query='{parentModels (first: 1, after:"Adriel", order:["name"]){id, name}}'results=graphql(schema,query)'''results.data { 'parentModels': [ {'name': 'Carolina', 'id': test_parent_2.id} ] } '''