{ "info": { "author": "Student.com", "author_email": "wearehiring@student.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Database", "Topic :: Database :: Front-Ends", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "SQLAlchemy filters\n==================\n\n.. pull-quote::\n\n Filter, sort and paginate SQLAlchemy query objects.\n Ideal for exposing these actions over a REST API.\n\n\n.. image:: https://img.shields.io/pypi/v/sqlalchemy-filters.svg\n :target: https://pypi.org/project/sqlalchemy-filters/\n\n.. image:: https://img.shields.io/pypi/pyversions/sqlalchemy-filters.svg\n :target: https://pypi.org/project/sqlalchemy-filters/\n\n.. image:: https://img.shields.io/pypi/format/sqlalchemy-filters.svg\n :target: https://pypi.org/project/sqlalchemy-filters/\n\n.. image:: https://travis-ci.org/juliotrigo/sqlalchemy-filters.svg?branch=master\n :target: https://travis-ci.org/juliotrigo/sqlalchemy-filters\n\n\nFiltering\n---------\n\nAssuming that we have a SQLAlchemy ``query`` object:\n\n.. code-block:: python\n\n from sqlalchemy import Column, Integer, String\n from sqlalchemy.ext.declarative import declarative_base\n\n\n class Base(object):\n id = Column(Integer, primary_key=True)\n name = Column(String(50), nullable=False)\n count = Column(Integer, nullable=True)\n\n\n Base = declarative_base(cls=Base)\n\n\n class Foo(Base):\n\n __tablename__ = 'foo'\n\n # ...\n\n query = session.query(Foo)\n\nThen we can apply filters to that ``query`` object (multiple times):\n\n.. code-block:: python\n\n from sqlalchemy_filters import apply_filters\n\n # `query` should be a SQLAlchemy query object\n\n filter_spec = [{'field': 'name', 'op': '==', 'value': 'name_1'}]\n filtered_query = apply_filters(query, filter_spec)\n\n more_filters = [{'field': 'foo_id', 'op': 'is_not_null'}]\n filtered_query = apply_filters(filtered_query, more_filters)\n\n result = filtered_query.all()\n\nIt is also possible to filter queries that contain multiple models,\nincluding joins:\n\n.. code-block:: python\n\n class Bar(Base):\n\n __tablename__ = 'bar'\n foo_id = Column(Integer, ForeignKey('foo.id'))\n\n\n.. code-block:: python\n\n query = session.query(Foo).join(Bar)\n\n filter_spec = [\n {'model': 'Foo', field': 'name', 'op': '==', 'value': 'name_1'},\n {'model': 'Bar', field': 'count', 'op': '>=', 'value': 5},\n ]\n filtered_query = apply_filters(query, filter_spec)\n\n result = filtered_query.all()\n\n\n``apply_filters`` will attempt to automatically join models to ``query``\nif they're not already present and a model-specific filter is supplied.\nFor example, the value of ``filtered_query`` in the following two code\nblocks is identical:\n\n.. code-block:: python\n\n query = session.query(Foo).join(Bar) # join pre-applied to query\n\n filter_spec = [\n {'model': 'Foo', field': 'name', 'op': '==', 'value': 'name_1'},\n {'model': 'Bar', field': 'count', 'op': '>=', 'value': 5},\n ]\n filtered_query = apply_filters(query, filter_spec)\n\n.. code-block:: python\n\n query = session.query(Foo) # join to Bar will be automatically applied\n\n filter_spec = [\n {field': 'name', 'op': '==', 'value': 'name_1'},\n {'model': 'Bar', field': 'count', 'op': '>=', 'value': 5},\n ]\n filtered_query = apply_filters(query, filter_spec)\n\nThe automatic join is only possible if sqlalchemy can implictly\ndetermine the condition for the join, for example because of a foreign\nkey relationship.\n\nAutomatic joins allow flexibility for clients to filter and sort by\nrelated objects without specifying all possible joins on the server\nbeforehand.\n\nNote that first filter of the second block does not specify a model.\nIt is implictly applied to the ``Foo`` model because that is the only\nmodel in the original query passed to ``apply_filters``.\n\nIt is also possible to apply filters to queries defined by fields or\nfunctions:\n\n.. code-block:: python\n\n query_alt_1 = session.query(Foo.id, Foo.name)\n query_alt_2 = session.query(func.count(Foo.id))\n\n\nRestricted Loads\n----------------\n\nYou can restrict the fields that SQLAlchemy loads from the database by\nusing the ``apply_loads`` function:\n\n.. code-block:: python\n\n query = session.query(Foo, Bar).join(Bar)\n load_spec = [\n {'model': 'Foo', 'fields': ['name']},\n {'model': 'Bar', 'fields': ['count']}\n ]\n query = apply_loads(query, load_spec) # will load only Foo.name and Bar.count\n\n\nThe effect of the ``apply_loads`` function is to ``_defer_`` the load\nof any other fields to when/if they're accessed, rather than loading\nthem when the query is executed. It only applies to fields that would be\nloaded during normal query execution.\n\n\nEffect on joined queries\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe default SQLAlchemy join is lazy, meaning that columns from the\njoined table are loaded only when required. Therefore ``apply_loads``\nhas limited effect in the following scenario:\n\n.. code-block:: python\n\n query = session.query(Foo).join(Bar)\n load_spec = [\n {'model': 'Foo', 'fields': ['name']}\n {'model': 'Bar', 'fields': ['count']} # ignored\n ]\n query = apply_loads(query, load_spec) # will load only Foo.name\n\n\n``apply_loads`` cannot be applied to columns that are loaded as\n`joined eager loads `_.\nThis is because a joined eager load does not add the joined model to the\noriginal query, as explained\n`here `_\n\nThe following would not prevent all columns from ``Bar`` being eagerly\nloaded:\n\n.. code-block:: python\n\n query = session.query(Foo).options(joinedload(Foo.bar))\n load_spec = [\n {'model': 'Foo', 'fields': ['name']}\n {'model': 'Bar', 'fields': ['count']}\n ]\n query = apply_loads(query, load_spec)\n\n.. sidebar:: Automatic Join\n\n In fact, what happens here is that ``Bar`` is automatically joined\n to ``query``, because it is determined that ``Bar`` is not part of\n the original query. The ``load_spec`` therefore has no effect\n because the automatic join results in lazy evaluation.\n\nIf you wish to perform a joined load with restricted columns, you must\nspecify the columns as part of the joined load, rather than with\n``apply_loads``:\n\n.. code-block:: python\n\n query = session.query(Foo).options(joinedload(Bar).load_only('count'))\n load_spec = [\n {'model': 'Foo', 'fields': ['name']}\n ]\n query = apply_loads(query. load_spec) # will load ony Foo.name and Bar.count\n\n\nSort\n----\n\n.. code-block:: python\n\n from sqlalchemy_filters import apply_sort\n\n # `query` should be a SQLAlchemy query object\n\n sort_spec = [\n {'model': 'Foo', field': 'name', 'direction': 'asc'},\n {'model': 'Bar', field': 'id', 'direction': 'desc'},\n ]\n sorted_query = apply_sort(query, sort_spec)\n\n result = sorted_query.all()\n\n\n``apply_sort`` will attempt to automatically join models to ``query`` if\nthey're not already present and a model-specific sort is supplied.\nThe behaviour is the same as in ``apply_filters``.\n\nThis allows flexibility for clients to sort by fields on related objects\nwithout specifying all possible joins on the server beforehand.\n\n\nPagination\n----------\n\n.. code-block:: python\n\n from sqlalchemy_filters import apply_pagination\n\n # `query` should be a SQLAlchemy query object\n\n query, pagination = apply_pagination(query, page_number=1, page_size=10)\n\n page_size, page_number, num_pages, total_results = pagination\n\n assert 10 == len(query)\n assert 10 == page_size == pagination.page_size\n assert 1 == page_number == pagination.page_number\n assert 3 == num_pages == pagination.num_pages\n assert 22 == total_results == pagination.total_results\n\nFilters format\n--------------\n\nFilters must be provided in a list and will be applied sequentially.\nEach filter will be a dictionary element in that list, using the\nfollowing format:\n\n.. code-block:: python\n\n filter_spec = [\n {'model': 'model_name', 'field': 'field_name', 'op': '==', 'value': 'field_value'},\n {'model': 'model_name', 'field': 'field_2_name', 'op': '!=', 'value': 'field_2_value'},\n # ...\n ]\n\nThe ``model`` key is optional if the original query being filtered only\napplies to one model.\n\nIf there is only one filter, the containing list may be omitted:\n\n.. code-block:: python\n\n filter_spec = {'field': 'field_name', 'op': '==', 'value': 'field_value'}\n\nWhere ``field`` is the name of the field that will be filtered using the\noperator provided in ``op`` (optional, defaults to ``==``) and the\nprovided ``value`` (optional, depending on the operator).\n\nThis is the list of operators that can be used:\n\n- ``is_null``\n- ``is_not_null``\n- ``==``, ``eq``\n- ``!=``, ``ne``\n- ``>``, ``gt``\n- ``<``, ``lt``\n- ``>=``, ``ge``\n- ``<=``, ``le``\n- ``like``\n- ``ilike``\n- ``in``\n- ``not_in``\n\nBoolean Functions\n^^^^^^^^^^^^^^^^^\n``and``, ``or``, and ``not`` functions can be used and nested within the\nfilter specification:\n\n.. code-block:: python\n\n filter_spec = [\n {\n 'or': [\n {\n 'and': [\n {'field': 'field_name', 'op': '==', 'value': 'field_value'},\n {'field': 'field_2_name', 'op': '!=', 'value': 'field_2_value'},\n ]\n },\n {\n 'not': [\n {'field': 'field_3_name', 'op': '==', 'value': 'field_3_value'}\n ]\n },\n ],\n }\n ]\n\n\nNote: ``or`` and ``and`` must reference a list of at least one element.\n``not`` must reference a list of exactly one element.\n\nSort format\n-----------\n\nSort elements must be provided as dictionaries in a list and will be\napplied sequentially:\n\n.. code-block:: python\n\n sort_spec = [\n {'model': 'Foo', 'field': 'name', 'direction': 'asc'},\n {'model': 'Bar', 'field': 'id', 'direction': 'desc'},\n # ...\n ]\n\nWhere ``field`` is the name of the field that will be sorted using the\nprovided ``direction``.\n\nThe ``model`` key is optional if the original query being sorted only\napplies to one model.\n\nnullsfirst / nullslast\n^^^^^^^^^^^^^^^^^^^^^^\n\n.. code-block:: python\n\n sort_spec = [\n {'model': 'Baz', 'field': 'count', 'direction': 'asc', 'nullsfirst': True},\n {'model': 'Qux', 'field': 'city', 'direction': 'desc', 'nullslast': True},\n # ...\n ]\n\n``nullsfirst`` is an optional attribute that will place ``NULL`` values first\nif set to ``True``, according to the `SQLAlchemy documentation `__.\n\n``nullslast`` is an optional attribute that will place ``NULL`` values last\nif set to ``True``, according to the `SQLAlchemy documentation `__.\n\nIf none of them are provided, then ``NULL`` values will be sorted according\nto the RDBMS being used. SQL defines that ``NULL`` values should be placed\ntogether when sorting, but it does not specify whether they should be placed\nfirst or last.\n\nEven though both ``nullsfirst`` and ``nullslast`` are part of SQLAlchemy,\nthey will raise an unexpected exception if the RDBMS that is being used does\nnot support them.\n\nAt the moment they are\n`supported by PostgreSQL `_,\nbut they are **not** supported by SQLite and MySQL.\n\n\n\nRunning tests\n-------------\n\nThe default configuration uses **SQLite**, **MySQL** (if the driver is\ninstalled, which is the case when ``tox`` is used) and **PostgreSQL**\n(if the driver is installed, which is the case when ``tox`` is used) to\nrun the tests, with the following URIs:\n\n.. code-block:: shell\n\n sqlite+pysqlite:///test_sqlalchemy_filters.db\n mysql+mysqlconnector://root:@localhost:3306/test_sqlalchemy_filters\n postgresql+psycopg2://postgres:@localhost:5432/test_sqlalchemy_filters?client_encoding=utf8'\n\nA test database will be created, used during the tests and destroyed\nafterwards for each RDBMS configured.\n\nThere are Makefile targets to run docker containers locally for both\n**MySQL** and **PostgreSQL**, using the default ports and configuration:\n\n.. code-block:: shell\n\n $ make docker-mysql-run\n $ make docker-postgres-run\n\nTo run the tests locally:\n\n.. code-block:: shell\n\n $ # Create/activate a virtual environment\n $ pip install tox\n $ tox\n\nThere are some other Makefile targets that can be used to run the tests:\n\n.. code-block:: shell\n\n $ # using default settings\n $ make test\n $ make coverage\n\n $ # overriding DB parameters\n $ ARGS='--mysql-test-db-uri mysql+mysqlconnector://root:@192.168.99.100:3340/test_sqlalchemy_filters' make test\n $ ARGS='--sqlite-test-db-uri sqlite+pysqlite:///test_sqlalchemy_filters.db' make test\n\n $ ARGS='--mysql-test-db-uri mysql+mysqlconnector://root:@192.168.99.100:3340/test_sqlalchemy_filters' make coverage\n $ ARGS='--sqlite-test-db-uri sqlite+pysqlite:///test_sqlalchemy_filters.db' make coverage\n\n\n\nDatabase management systems\n---------------------------\n\nThe following RDBMS are supported (tested):\n\n- SQLite\n- MySQL\n- PostgreSQL\n\n\nPython 2\n--------\n\nThere is no active support for python 2, however it is compatible as of\nFebruary 2019, if you install ``funcsigs``.\n\n\nChangelog\n---------\n\nConsult the `CHANGELOG `_\ndocument for fixes and enhancements of each version.\n\n\nLicense\n-------\n\nApache 2.0. See `LICENSE `_\nfor details.\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/juliotrigo/sqlalchemy-filters", "keywords": "", "license": "Apache License, Version 2.0", "maintainer": "", "maintainer_email": "", "name": "sqlalchemy-filters", "package_url": "https://pypi.org/project/sqlalchemy-filters/", "platform": "", "project_url": "https://pypi.org/project/sqlalchemy-filters/", "project_urls": { "Homepage": "https://github.com/juliotrigo/sqlalchemy-filters" }, "release_url": "https://pypi.org/project/sqlalchemy-filters/0.10.0/", "requires_dist": [ "sqlalchemy (>=1.0.16)", "six (>=1.10.0)", "pytest (==4.3.0) ; extra == 'dev'", "flake8 (==3.7.7) ; extra == 'dev'", "coverage (==4.5.3) ; extra == 'dev'", "sqlalchemy-utils (==0.33.11) ; extra == 'dev'", "restructuredtext-lint (==1.2.2) ; extra == 'dev'", "Pygments (==2.3.1) ; extra == 'dev'", "mysql-connector-python-rf (==2.2.2) ; extra == 'mysql'", "psycopg2 (==2.7.7) ; extra == 'postgresql'", "funcsigs (>=1.0.2) ; extra == 'python2'" ], "requires_python": "", "summary": "A library to filter SQLAlchemy queries.", "version": "0.10.0" }, "last_serial": 4934271, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "76ca256d3a6e29329dcff1fda8229079", "sha256": "34265e3b4605aae6e7c7fe3082b1de148c6295409f4d34286447f8c195bac699" }, "downloads": -1, "filename": "sqlalchemy_filters-0.10.0-py3-none-any.whl", "has_sig": false, "md5_digest": "76ca256d3a6e29329dcff1fda8229079", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13790, "upload_time": "2019-03-13T12:05:15", "url": "https://files.pythonhosted.org/packages/d7/1a/f43eb9a76145a98cca23c4ac7085bd7dc0531545a6cd00cfca1b6223b79d/sqlalchemy_filters-0.10.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "18ba5c3fd5ecca954ec586e1a975fc8d", "sha256": "3b0d4fc39075cd1079e6089ac3165c1930b74fb1804515f109ec80e75fec46c8" }, "downloads": -1, "filename": "sqlalchemy-filters-0.10.0.tar.gz", "has_sig": false, "md5_digest": "18ba5c3fd5ecca954ec586e1a975fc8d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16353, "upload_time": "2019-03-13T12:05:16", "url": "https://files.pythonhosted.org/packages/e1/05/fb6ee2748feb48a5e647c6661a795c71af3a2186140d559100fbca66b198/sqlalchemy-filters-0.10.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "68395bb825ab2c2269f7128dc341cf2e", "sha256": "ec24a191df860c93fb02ee4379f9b49196d0a52fede4aef43783dd4aa8969ebe" }, "downloads": -1, "filename": "sqlalchemy-filters-0.2.0.tar.gz", "has_sig": false, "md5_digest": "68395bb825ab2c2269f7128dc341cf2e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5651, "upload_time": "2017-02-17T15:21:29", "url": "https://files.pythonhosted.org/packages/5a/c3/9e3494900983000f05b53c8e35859a748eceb3df08d2a5a2d8b106adfe9f/sqlalchemy-filters-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "aded656a46e7764cb07a40a621750b0c", "sha256": "94ab8a7e79c32f3495431aad34495a18a0ac02e7f7c27645b6ef841f40e2fa27" }, "downloads": -1, "filename": "sqlalchemy-filters-0.3.0.tar.gz", "has_sig": false, "md5_digest": "aded656a46e7764cb07a40a621750b0c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7176, "upload_time": "2017-05-30T17:38:52", "url": "https://files.pythonhosted.org/packages/cc/d2/6b9e4f32e1bc12af44af79a28193576c7e5fae662313c3456c88cbba8502/sqlalchemy-filters-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "c7203cc2df138ac91ef056c87106d50f", "sha256": "1fa8a56db1c1e44d99926249d08343c33952e1a035b234ce890e419f326a04f1" }, "downloads": -1, "filename": "sqlalchemy_filters-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c7203cc2df138ac91ef056c87106d50f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11308, "upload_time": "2017-06-21T10:45:24", "url": "https://files.pythonhosted.org/packages/f7/82/7c8da0db3cd37499a2b5300767cb91ab24a34ab87cfc566f600fcf01da8d/sqlalchemy_filters-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "326e61336e8c54651e962392b11fd7d5", "sha256": "2654342d6342af72033a41ffd9b05885b85fe432c4e72dd9154327e915ef7dc2" }, "downloads": -1, "filename": "sqlalchemy-filters-0.4.0.tar.gz", "has_sig": false, "md5_digest": "326e61336e8c54651e962392b11fd7d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7274, "upload_time": "2017-06-21T10:45:26", "url": "https://files.pythonhosted.org/packages/04/ce/142e8b447b5f9f40e436658a453a34b187ed3ba0f0108d185a23a1c3cf25/sqlalchemy-filters-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "b7be2776b255b98ccd489a5c000d28d3", "sha256": "244a0d3b914ac17b5016d0ee3106dc9c088cc398327a369fee35808aa9a3c4b6" }, "downloads": -1, "filename": "sqlalchemy_filters-0.5.0-py2-none-any.whl", "has_sig": false, "md5_digest": "b7be2776b255b98ccd489a5c000d28d3", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11554, "upload_time": "2017-11-15T15:24:50", "url": "https://files.pythonhosted.org/packages/4b/f4/11988b4d7377ecbd7ddd12a8f42948f1c85148e1a90c3a9ed8a8f210f449/sqlalchemy_filters-0.5.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b1beef15ee31d4f18e4256f48e50c01", "sha256": "7ad69040caced71867601985ef707c2f316fefd252f7b2350e777241fd6c3de3" }, "downloads": -1, "filename": "sqlalchemy-filters-0.5.0.tar.gz", "has_sig": false, "md5_digest": "8b1beef15ee31d4f18e4256f48e50c01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6913, "upload_time": "2017-11-15T15:24:51", "url": "https://files.pythonhosted.org/packages/ff/b8/257deca7abb298d68ae1e5c902495748140e68f3c4650e5dab5ab602934b/sqlalchemy-filters-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "02c95bd577a3faca5b3079f362398b1e", "sha256": "adc109ca97919abf6ce884fdd181bf2df5ac9f72891a68cbbaea1b11733d43b8" }, "downloads": -1, "filename": "sqlalchemy_filters-0.6.0-py2-none-any.whl", "has_sig": false, "md5_digest": "02c95bd577a3faca5b3079f362398b1e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14029, "upload_time": "2017-11-30T12:13:53", "url": "https://files.pythonhosted.org/packages/c8/6d/f5262c077b9e05591d949937bd336e18bc93b5b02731c4e08e8428eb1d5c/sqlalchemy_filters-0.6.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e03036cd66105ce5fdcaa49e8ebda451", "sha256": "5d90b0604da94c19e9598830bd9e87a401ffd0fd52e0691c2c3f5bfa31ff029f" }, "downloads": -1, "filename": "sqlalchemy-filters-0.6.0.tar.gz", "has_sig": false, "md5_digest": "e03036cd66105ce5fdcaa49e8ebda451", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8372, "upload_time": "2017-11-30T12:13:55", "url": "https://files.pythonhosted.org/packages/bb/7a/63873de6bb039aecde1909d8b98686a808243f76c84134368ef84e22b34b/sqlalchemy-filters-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "d7d04212e2c0c7d2d71e460af0516297", "sha256": "5eeca25cc6b0b6daff46e3cb92f5628b3bedc363ee02d7c39a217a6542020cb7" }, "downloads": -1, "filename": "sqlalchemy_filters-0.7.0-py2-none-any.whl", "has_sig": false, "md5_digest": "d7d04212e2c0c7d2d71e460af0516297", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15897, "upload_time": "2018-02-12T11:54:15", "url": "https://files.pythonhosted.org/packages/f2/bc/a1f1eb6e1bb331b2c9792adecfa54e72db910b152f9d15c5836ecececdfe/sqlalchemy_filters-0.7.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b46cb04f5189c24860e6c093f3fcea2c", "sha256": "4508eba4dfb59470b17a667673b46de7102fd58cbcce8e62631e440f63eb0157" }, "downloads": -1, "filename": "sqlalchemy-filters-0.7.0.tar.gz", "has_sig": false, "md5_digest": "b46cb04f5189c24860e6c093f3fcea2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10508, "upload_time": "2018-02-12T11:54:17", "url": "https://files.pythonhosted.org/packages/8a/4e/7be981cefe6438c42239c45c8729d18606b9f586f43f9db0051c1be18ca1/sqlalchemy-filters-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "6fe5d88d5a0cc073c4e4997c3bec1216", "sha256": "f48418bf352354db7938a1a90bffe7d8f5cbd8b2a0db9fb19e8ce5da758a2f66" }, "downloads": -1, "filename": "sqlalchemy_filters-0.8.0-py2-none-any.whl", "has_sig": false, "md5_digest": "6fe5d88d5a0cc073c4e4997c3bec1216", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11910, "upload_time": "2018-06-25T07:36:44", "url": "https://files.pythonhosted.org/packages/8d/19/c249f7a0c1ec763cfa1f8f6c594a3c4ee312b11e7d0f5fb103a9612093ad/sqlalchemy_filters-0.8.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c16042e0dd810e871ecd4f6cc3b5c55f", "sha256": "dee658454a67c2090d2884da994c4100001125d93ee43c24cf15b668529d0ae1" }, "downloads": -1, "filename": "sqlalchemy-filters-0.8.0.tar.gz", "has_sig": false, "md5_digest": "c16042e0dd810e871ecd4f6cc3b5c55f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10535, "upload_time": "2018-06-25T07:36:45", "url": "https://files.pythonhosted.org/packages/0b/06/1b465867b94c3203d7eb030bc081f033786700f780aeb3b5602e94b5930d/sqlalchemy-filters-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "7561ca65d07a78816b1cf95ba45a47ac", "sha256": "d122f5b39ab6837c5b16b3273f506fc6e56ce01ff0cbcb39207f4c075c73d420" }, "downloads": -1, "filename": "sqlalchemy_filters-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7561ca65d07a78816b1cf95ba45a47ac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13145, "upload_time": "2019-03-07T12:11:34", "url": "https://files.pythonhosted.org/packages/7d/f9/588b64a8611b19649689c05b13518441acb15ef27be49f8c8698089296d8/sqlalchemy_filters-0.9.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "849596443d599e48edddd7fadabc213f", "sha256": "020656e98a459ebb6d0a4d72b78e966e3335571bb631c5012605b6ce4b8efcbd" }, "downloads": -1, "filename": "sqlalchemy-filters-0.9.0.tar.gz", "has_sig": false, "md5_digest": "849596443d599e48edddd7fadabc213f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15045, "upload_time": "2019-03-07T12:11:35", "url": "https://files.pythonhosted.org/packages/c8/50/4f918e8f2c5731b3d4d9e125f5238bfeabd4a0de7a77d4aaaef99f0cff82/sqlalchemy-filters-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "76ca256d3a6e29329dcff1fda8229079", "sha256": "34265e3b4605aae6e7c7fe3082b1de148c6295409f4d34286447f8c195bac699" }, "downloads": -1, "filename": "sqlalchemy_filters-0.10.0-py3-none-any.whl", "has_sig": false, "md5_digest": "76ca256d3a6e29329dcff1fda8229079", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13790, "upload_time": "2019-03-13T12:05:15", "url": "https://files.pythonhosted.org/packages/d7/1a/f43eb9a76145a98cca23c4ac7085bd7dc0531545a6cd00cfca1b6223b79d/sqlalchemy_filters-0.10.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "18ba5c3fd5ecca954ec586e1a975fc8d", "sha256": "3b0d4fc39075cd1079e6089ac3165c1930b74fb1804515f109ec80e75fec46c8" }, "downloads": -1, "filename": "sqlalchemy-filters-0.10.0.tar.gz", "has_sig": false, "md5_digest": "18ba5c3fd5ecca954ec586e1a975fc8d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16353, "upload_time": "2019-03-13T12:05:16", "url": "https://files.pythonhosted.org/packages/e1/05/fb6ee2748feb48a5e647c6661a795c71af3a2186140d559100fbca66b198/sqlalchemy-filters-0.10.0.tar.gz" } ] }