{ "info": { "author": "Sean Stewart", "author_email": "sean_stewart@me.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: SQL", "Topic :: Database", "Topic :: Database :: Front-Ends", "Topic :: Software Development :: Code Generators", "Topic :: Utilities" ], "description": "Que: SQL for Sneks \ud83d\udc0d\n================\n[![image](https://img.shields.io/pypi/v/que-py.svg)](https://pypi.org/project/que-py/)\n[![image](https://img.shields.io/pypi/l/que-py.svg)](https://pypi.org/project/que-py/)\n[![image](https://img.shields.io/pypi/pyversions/que-py.svg)](https://pypi.org/project/que-py/)\n[![image](https://img.shields.io/github/languages/code-size/seandstewart/que.svg?style=flat)](https://github.com/seandstewart/que)\n[![image](https://img.shields.io/travis/seandstewart/que.svg)](https://travis-ci.org/seandstewart/que)\n[![codecov](https://codecov.io/gh/seandstewart/que/branch/master/graph/badge.svg)](https://codecov.io/gh/seandstewart/que)\n\nQue allows you to get generate your SQL queries on the fly, without the\noverhead of a fully-fledged ORM.\n\nMotivations\n--------\nQue was born out of a need for dynamically generated SQL for an ASGI web\nservice. I found my self wishing for the convenience of dynamic querying\nwith an ORM such as SQLAlchemy, but the performance of a fully\nasynchronous database client. Que attempts to fill this void. Choose the\nconnection client you prefer and let Que worry about the SQL.\n\n\nWhat Is It?\n---------\nQue looks to solve a single purpose: generate SQL-compliant queries in \npure-Python. Que has absolutely no hard dependendencies and does not\nenforce the use of a specific database client or dialect.\n\nStill want to use SQLAlchemy for your connection? Go for it. Want to use\nPyMySQL or psycopg2? Que won't stop you. Want to use an asyncio\nframework such as aiopg? You have excellent taste! This library was\nwritten just for you.\n\n\nDesign\n-----\nThe focus of Que is *simplicity*, just look at what it takes for a \nsimple `SELECT`:\n\n```python\n>>> import que\n>>> select = que.Select(table='foo')\n>>> select\nSelect(table='foo', schema=None, filters=FilterList([]), fields=FieldList([]))\n>>> sql, args = select.to_sql()\n>>> print(sql)\nSELECT\n *\nFROM\n foo\n\n```\n\nQue works with the DBAPI client of your choice by parametrizing your sql\nand formatting your arguments for you:\n\n```python\n>>> import que\n>>> fields = [que.Field('bar')]\n>>> filters = [que.Filter(que.Field('id', 1))]\n>>> select = que.Select(table='foo', filters=filters, fields=fields)\n>>> sql, args = select.to_sql()\n>>> print(sql)\nSELECT\n bar\nFROM\n foo\nWHERE\n id = :1\n\n>>> args\n[1]\n>>> sql, args = select.to_sql(style=que.NameParamStyle.NAME)\n>>> print(sql)\nSELECT\n bar\nFROM\n foo\nWHERE\n id = :id\n\n>>> args\n{'id': 1}\n\n```\n\nQue works to normalize the API for your SQL operations, so that \ninitializing an `INSERT` or `UPDATE` is functionally the same as\ninitializing a `SELECT`:\n\n```python\n>>> import que\n>>> import dataclasses\n>>> import datetime\n>>>\n>>> @dataclasses.dataclass\n... class Foo:\n... bar: str\n... id: int = None\n... created: datetime.datetime = None\n... \n>>> new_foo = Foo('blah')\n>>> fields = que.data_to_fields(new_foo, exclude=None)\n>>> insert = que.Insert(table='foo', fields=fields)\n>>> sql, args = insert.to_sql(que.NameParamStyle.NAME)\n>>> print(sql)\nINSERT INTO\n foo (:colbar)\nVALUES\n (:valbar)\n\n>>> args\n{'colbar': 'bar', 'valbar': 'blah'}\n\n```\n\nQuickStart\n--------\nQue has no dependencies and is exceptionally light-weight (currently\nonly ~30Kb!), comprising of only a few hundred lines of code.\nInstallation is as simple as `pip3 install que-py`.\n\nThen you're good to go! `import que` and rock on \ud83e\udd18\n\n\nExamples\n-------\nA simple client for generating your SQL and inserting new entries:\n```python\nimport dataclasses\nimport sqlite3\n\nimport que\n\n@dataclasses.dataclass\nclass Spam:\n flavor: str\n id: int = None\n created_on: int = None\n\n\nclass SpamClient:\n \"\"\"A database client for tracking spam flavors.\"\"\"\n\n def __init__(self):\n self.conn = sqlite3.connect('sqlite://spam.db')\n\n def insert_spam(self, spam: Spam):\n fields = que.data_to_fields(spam, exclude=None)\n insert = que.Insert('spam', fields=fields)\n sql, args = insert.to_sql()\n return self.conn.execute(sql, args)\n\n def get_spam(self, **kwargs):\n fields = que.data_to_fields(kwargs)\n filters = [que.Filter(x) for x in fields]\n select = que.Select('spam', filters=filters)\n return self.conn.execute(*select.to_sql())\n\n def update_spam(self, spam: Spam):\n fields = [que.Field('flavor', spam.flavor)]\n filters = [que.Filter(que.Field('id', spam.id))]\n update = que.Update('spam', filters=filters, fields=fields)\n return self.conn.execute(*update.to_sql())\n\n def delete_spam(self, spam: Spam):\n filters = [que.Filter(que.Field('id', spam.id))]\n delete = que.Delete('spam', filters=filters)\n return self.conn.execute(*delete.to_sql())\n```\n\nDocumentation\n----------\nFull documentation coming soon!\n\nHappy Querying \ud83d\udc0d\n\n\nHow to Contribute\n-----------------\n1. Check for open issues or open a fresh issue to start a discussion\n around a feature idea or a bug. \n2. Create a branch on Github for your issue or fork \n [the repository](https://github.com/seandstewart/que) on GitHub to\n start making your changes to the **master** branch.\n3. Write a test which shows that the bug was fixed or that the feature\n works as expected.\n4. Send a pull request and bug the maintainer until it gets merged and\n published. :)\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/seandstewart/que", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "que-py", "package_url": "https://pypi.org/project/que-py/", "platform": "", "project_url": "https://pypi.org/project/que-py/", "project_urls": { "Homepage": "https://github.com/seandstewart/que" }, "release_url": "https://pypi.org/project/que-py/1.1.1/", "requires_dist": null, "requires_python": ">=3.7", "summary": "Que: SQL for Sneks \ud83d\udc0d", "version": "1.1.1" }, "last_serial": 5437409, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "461c07b29fdbabdfe1317b83353b04b8", "sha256": "e1bf78b2c2f91c7eaa11b338eaaea8a8d4be359e2e685ba384549d5106bbee77" }, "downloads": -1, "filename": "que_py-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "461c07b29fdbabdfe1317b83353b04b8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.7", "size": 10246, "upload_time": "2019-02-14T22:25:42", "url": "https://files.pythonhosted.org/packages/6e/9f/5d8e5521172e045645d01388ae4f1334d4e599ef332c7758f8d0ce320ce3/que_py-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c0f869c41ca87967815f68504268e35", "sha256": "a9d84b0c9ee7e0c43f73204cac105cf0b06ccf16f651dfb2509cbec91938a185" }, "downloads": -1, "filename": "que-py-1.0.0.tar.gz", "has_sig": false, "md5_digest": "2c0f869c41ca87967815f68504268e35", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 11121, "upload_time": "2019-02-14T22:25:44", "url": "https://files.pythonhosted.org/packages/21/d9/f734eaa5091afa97e34a3a498b16c2cecf2c166a79e4285a914dbe656062/que-py-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "47b1ae2bd029fb82470154c635606c82", "sha256": "30a59d97f5008285d3f403f7fde93adf420e026ecf17a53ee9cb88deea46b789" }, "downloads": -1, "filename": "que_py-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "47b1ae2bd029fb82470154c635606c82", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.7", "size": 10238, "upload_time": "2019-02-14T22:34:52", "url": "https://files.pythonhosted.org/packages/32/40/c7f505730d258d8a2245bf69b7c99f6e1c3347839fbd951b6b1d6a9711d6/que_py-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "22ae2060a265148ae2103a1fe541963d", "sha256": "8d832bea606138601adaa4b40cca87868e91058b9e4bd97537428a9ade5f89d6" }, "downloads": -1, "filename": "que-py-1.0.1.tar.gz", "has_sig": false, "md5_digest": "22ae2060a265148ae2103a1fe541963d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 11116, "upload_time": "2019-02-14T22:34:53", "url": "https://files.pythonhosted.org/packages/4d/5d/101234ec6776b17b14ea8b1be2ad89a079b61a543a04a4a189b6e3371642/que-py-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "882071a70b92ae7af59495ece3129cb2", "sha256": "1795840133bd5ff18fadf541a2e627c98aa01443cb0a27c70d923800309a9603" }, "downloads": -1, "filename": "que_py-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "882071a70b92ae7af59495ece3129cb2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.7", "size": 10696, "upload_time": "2019-04-19T11:38:13", "url": "https://files.pythonhosted.org/packages/01/40/e3e1a086a014a2fb9476e6fc107d145a0fd0e8e6fc8cf76c29c144012a42/que_py-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "289e295476ce1a9c906c61dc531fc5d7", "sha256": "db201ef8cd651182b625751c7065ce4074fa6e18490ed2582faff818aaae7fac" }, "downloads": -1, "filename": "que-py-1.1.0.tar.gz", "has_sig": false, "md5_digest": "289e295476ce1a9c906c61dc531fc5d7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 12356, "upload_time": "2019-04-19T11:38:14", "url": "https://files.pythonhosted.org/packages/69/10/56d9f81af1d98f1d02055c5fa2969c8579d8eeb82d347a13363d75f83031/que-py-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "3e0f5c1b496acb6d0400ed793219df97", "sha256": "b062be82c0c1f759980fc0c5cbc2ee57ac9ac51240a538407e0ba9bb0628032e" }, "downloads": -1, "filename": "que_py-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3e0f5c1b496acb6d0400ed793219df97", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.7", "size": 10722, "upload_time": "2019-06-23T14:07:31", "url": "https://files.pythonhosted.org/packages/7b/03/19dd8d38a4f49462f550dfe45c7dec0bf91b664d1ebb03f1fe02c72cf9fd/que_py-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b8352e1e17851ff245bee86f0787d8b6", "sha256": "939c0c218e6f752f44b0eceec42b3f389151927501eeff99bb4d17c714943494" }, "downloads": -1, "filename": "que-py-1.1.1.tar.gz", "has_sig": false, "md5_digest": "b8352e1e17851ff245bee86f0787d8b6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 12900, "upload_time": "2019-06-23T14:07:33", "url": "https://files.pythonhosted.org/packages/7b/90/0b2784e269eac964b6809ce3cca94980022fb2fe89747251d71f341d398d/que-py-1.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3e0f5c1b496acb6d0400ed793219df97", "sha256": "b062be82c0c1f759980fc0c5cbc2ee57ac9ac51240a538407e0ba9bb0628032e" }, "downloads": -1, "filename": "que_py-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3e0f5c1b496acb6d0400ed793219df97", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.7", "size": 10722, "upload_time": "2019-06-23T14:07:31", "url": "https://files.pythonhosted.org/packages/7b/03/19dd8d38a4f49462f550dfe45c7dec0bf91b664d1ebb03f1fe02c72cf9fd/que_py-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b8352e1e17851ff245bee86f0787d8b6", "sha256": "939c0c218e6f752f44b0eceec42b3f389151927501eeff99bb4d17c714943494" }, "downloads": -1, "filename": "que-py-1.1.1.tar.gz", "has_sig": false, "md5_digest": "b8352e1e17851ff245bee86f0787d8b6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 12900, "upload_time": "2019-06-23T14:07:33", "url": "https://files.pythonhosted.org/packages/7b/90/0b2784e269eac964b6809ce3cca94980022fb2fe89747251d71f341d398d/que-py-1.1.1.tar.gz" } ] }