处理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实现双锁并发队列   java如何更改SpringWS 2.4.4版或更高版本中maxOccurs的默认限制?   java Selenium RC如何处理动态行?   java何时引入Javac StringBuilder/StringBuffer优化?   java mediaplayer在R.raw Android上失败   java JPA2:不区分大小写,就像在任何地方匹配一样   如何从JDK15中提取java预览类文件?   java与mySQL删除查询不一致   从Shutdownow()返回的java列表<Runnable>无法转换为提交的Runnable   java如何从回调接口获取对象值?   java如何获得视图的高度,在xml中可见性和高度定义为wrap_内容?   postgresql Mybatis在启动时遇到“由以下原因引起:java.net.UnknownHostException:localhost”,为什么?   带有实例调用的方法调用的java intellij格式化程序换行   由于特定的第三方库,java Proguard产生运行时错误   动画JAVA JPanel同时滑出和滑入