处理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}
    ]
}
'''

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Requestcontextholder在spring 4中具有并发访问权限。IBMWebSphere上的x Web应用程序?   java如何下载、设置和使用Eclipse?   java如何组合这些mysql语句   java JDBC无法连接到openshift上的mysql数据库   如果存在允许正确处理的重载,java对于方便的方法来说是否可行?   使用hibernate序列的java Spring MVC不存在   具有路径的java Selenium ChromeDriver负载扩展问题   读一本书。java中的java文件   退出队列时,Java队列程序结果为空   Java lambda返回带有重复代码问题的列表   java使用意图从其他活动传递数据并在listview中显示   java如何在java中创建JSON输出   java Android:在不破坏或暂停活动的情况下关闭显示   支持Android电视和手机的java多apk   关于Java应用程序测试和调试的一组问题   如何在JavaSE中使用jdbcRealmShiro进行授权   在java中是否有一个无异常检查的URL解析实用程序?   当页面上有多个相同类型的元素时,java会选择一个特定的元素   递归需要帮助发现java代码中的缺陷