{ "info": { "author": "Adriel Velazquez", "author_email": "adrielvelazquez@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "SQLAlchemy GraphQL \n===================\n\n\nSQLAlchemy GraphQL is a plugin for GraphQL Epoxy that provides universal functions for\nSQLAlchemy models being used for GraphQL\n\n**Graphene Support Coming Soon**\n\nInstallation\n------------\n\nSQLAlchemy Sphinx is available on pypi under the package name\n``sqlalchemy-graphql``, you can get it by running:\n\n.. code:: sh\n\n pip install sqlalchemy-graphql\n\n\nUsage\n-----\n\nThe first step is registering your type registry. This adds all the features into your\nregistry without you having to do any work. It leverages GraphQL aliasing. \n\n.. code:: python\n\n from epoxy import TypeRegistry\n\n from sqlalchemy_graphql.epoxy import EpoxySQLAlchemy\n\n R = TypeRegistry()\n esql = EpoxySQLAlchemy()\n esql.register(R)\n\n\nOnce this is done, your registry now has a new Interface called FuncBase, which will be the one of the \ninterfaces all your graphql models will use.\n\nHere we'll define the SQLAlchemy models using epoxy's Registry decorators.\n\n.. code:: python\n\n from sqlalchemy import create_engine, Column, Integer, String, ForeignKey\n from sqlalchemy.ext.declarative import declarative_base\n from sqlalchemy.orm import relationship, backref, sessionmaker\n\n from youe_application import R\n engine = create_engine('sqlite:///:memory:', echo=True)\n Base = declarative_base(bind=engine)\n Session = sessionmaker(bind=engine)\n session = Session()\n\n\n @R.ParentModel.CanBe\n class ParentModel(Base):\n __tablename__ = \"parents\"\n id = Column(Integer, primary_key=True)\n name = Column(String)\n\n\n @R.ChildModel.CanBe\n class ChildModel(Base):\n __tablename__ = \"children\"\n id = Column(Integer, primary_key=True)\n name = Column(String)\n parent_id = Column(Integer, ForeignKey(\"parents.id\"), nullable=False)\n parent = relationship(\"ParentModel\", backref=backref(\"children\", lazy=\"dynamic\", cascade=\"all,delete-orphan\"))\n\n\n\nAnd finally defining the GraphQL models. \n\nThe first things that need to be done is during any relational, or sqlalchemy model query, we need to\ninclude the esql.quey_args. I created a global varaible below, but you can add them however you wish.\n\n\n.. code:: python\n\n from your_application import R, esql\n from your_application.your_sqlalchemy_models import ChildModel as BaseChildModel, ParentModel as BaseParentModel, session\n\n from sqlalchemy_graphql.epoxy.utils import add_query_args\n from sqlalchemy_graphql.epoxy.query import resolve_sqlalchemy\n\n model_args = add_query_args({\"id\": R.Int, \"name\": R.String, \"ids\": R.Int.List}, esql.query_args)\n\n\n class ParentModel(R.Implements.FuncBase):\n id = R.Int\n name = R.String\n children = R.ChildModel.List(args=model_args)\n\n def resolve_children(self, obj, args, info):\n return resolve_sqlalchemy(obj, args, info, BaseChildModel, query=obj.children)\n\n\n class ChildModel(R.Implements.FuncBase):\n id = R.Int\n name = R.String\n parent = R.ParentModel(args=model_args)\n\n def resolve_parent(self, obj, args, info):\n return resolve_sqlalchemy(obj, args, info, BaseParentModel, query=obj.parent)\n\n\n class Query(R.ObjectType):\n parent_model = R.ParentModel(args=model_args)\n child_model = R.ChildModel(args=model_args)\n parent_models = R.ParentModel.List(args=model_args)\n child_models = R.ChildModel.List(args=model_args)\n\n def resolve_parent_model(self, obj, args, info):\n query = session.query(BaseParentModel)\n return resolve_sqlalchemy(obj, args, info, BaseParentModel, query=query, single=True)\n\n def resolve_child_model(self, obj, args, info):\n query = session.query(BaseChildModel)\n return resolve_sqlalchemy(obj, args, info, BaseChildModel, query=query, single=True)\n\n def resolve_parent_models(self, obj, args, info):\n query = session.query(BaseParentModel)\n return resolve_sqlalchemy(obj, args, info, BaseParentModel, query=query)\n\n def resolve_child_models(self, obj, args, info):\n query = session.query(BaseChildModel)\n return resolve_sqlalchemy(obj, args, info, BaseChildModel)\n )\n\nYou'll notice in the resolves for the Query, we're using the helper function resolve_sqlalchemy, proided by sqlalchemy-graphql to resolve any query arguements that are going to be used. \n\nAll that needs to be passed in is a Base query that has the SQLAlchemy model as the first argument,\nand you're good to go. \n\n\nExamples\n--------\n\n\nThe tests provided has a ton of examples, \nbut here is some basic queries you can now do with your universal func. \n\n\nYou can essentially do anything that the SQLAlchemy func offers you to do\n\nThe basic formating is:\n\n.. code:: python\n\n func(field:\"{YOUR TARGET ATTRIBUTE}\", op:\"YOUR OPERATION\")\n func(field:\"id\", op:\"min\")}\n func(field:\"id\", op:\"max\")}\n func(field:\"count\", op:\"sum\")}\n\n.. code:: python\n\n test_parent_1 = ParentModel(name=\"Adriel\")\n test_parent_2 = ParentModel(name=\"Carolina\")\n session.add(test_parent_1)\n session.add(test_parent_2)\n session.commit()\n\n schema = R.Schema(R.Query)\n\n query = '{parentModel {idSum: func(field:\"id\", op:\"sum\")}}'\n results = graphql(schema, query)\n value = test_parent_1.id + test_parent_2.id\n assert results.data['parentModel']['idSum'] == value\n\n\n query = '{parentModels {distinctName: count(distinct:\"name\")}}'\n results = graphql(schema, query)\n # results.data == {'parentModels': [{'distinctName': 2}]}\n\n\n query = '{parentModels (first: 1, after:\"Adriel\", order:[\"name\"]){id, name}}'\n results = graphql(schema, query)\n\n '''results.data\n {\n 'parentModels': [\n {'name': 'Carolina', 'id': test_parent_2.id}\n ]\n }\n '''", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "sqlalchemy_graphql", "package_url": "https://pypi.org/project/sqlalchemy_graphql/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/sqlalchemy_graphql/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/sqlalchemy_graphql/1.3/", "requires_dist": null, "requires_python": null, "summary": "GraphQL extension for dealing with SQLAlchemy", "version": "1.3" }, "last_serial": 2043977, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "95b60ebc52089b1fd485f3ff0b0ae928", "sha256": "313964e2f037a41fefa1d55866a5fc02ae8a00250e60d5dc62ea42753c8c4980" }, "downloads": -1, "filename": "sqlalchemy_graphql-0.1.1.tar.gz", "has_sig": false, "md5_digest": "95b60ebc52089b1fd485f3ff0b0ae928", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6118, "upload_time": "2016-04-03T23:40:51", "url": "https://files.pythonhosted.org/packages/3a/4b/fa5105574febc25d1f238a1589d6194c269a136c330e3987830492433634/sqlalchemy_graphql-0.1.1.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "fab2e62e8a502539b6948ac52e0b671e", "sha256": "5c869d0755ec77b1fe090af5dcbc8f19c29b3947b7947c5e345ac37a0b1a7e0f" }, "downloads": -1, "filename": "sqlalchemy_graphql-1.1.tar.gz", "has_sig": false, "md5_digest": "fab2e62e8a502539b6948ac52e0b671e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6094, "upload_time": "2016-04-04T00:17:50", "url": "https://files.pythonhosted.org/packages/9b/7f/584dccff18759db77a5c97fe0468194fd20c8fdb432d141547100c2d9b07/sqlalchemy_graphql-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "7c412e85cd9e341de473531a916d5b4f", "sha256": "5c849cadde81ffed9f567f047672fdbc7617f909ff8ef583ebde3a665cabff43" }, "downloads": -1, "filename": "sqlalchemy_graphql-1.2.tar.gz", "has_sig": false, "md5_digest": "7c412e85cd9e341de473531a916d5b4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6023, "upload_time": "2016-04-04T00:21:15", "url": "https://files.pythonhosted.org/packages/02/4e/7abe2116b159adb286740b261d85891dff13d13d4f559657d30904c6edc6/sqlalchemy_graphql-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "9973a4c20fce42135c7181284db79d31", "sha256": "3f4b7836291c8ce9a3deee5a3901c8deaa8765cd641e53a96946c8f9df5257dc" }, "downloads": -1, "filename": "sqlalchemy_graphql-1.3.tar.gz", "has_sig": false, "md5_digest": "9973a4c20fce42135c7181284db79d31", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6034, "upload_time": "2016-04-04T00:26:12", "url": "https://files.pythonhosted.org/packages/45/86/d607aad53447c7d42f764f341fa1a4e1d9f97103ad82c4bc207285c46883/sqlalchemy_graphql-1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9973a4c20fce42135c7181284db79d31", "sha256": "3f4b7836291c8ce9a3deee5a3901c8deaa8765cd641e53a96946c8f9df5257dc" }, "downloads": -1, "filename": "sqlalchemy_graphql-1.3.tar.gz", "has_sig": false, "md5_digest": "9973a4c20fce42135c7181284db79d31", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6034, "upload_time": "2016-04-04T00:26:12", "url": "https://files.pythonhosted.org/packages/45/86/d607aad53447c7d42f764f341fa1a4e1d9f97103ad82c4bc207285c46883/sqlalchemy_graphql-1.3.tar.gz" } ] }