SQLAlchemy query filtering and sorting wrapper in JSON format.
Project description
SQLAlchemy filtering & sorting utility
Table of contents
Purpose
This repository was developed to provide a simple JSON format interface to the SQLAlchemy
query API to query on json SQL fields, which can be used by front-end applications to generate automatically SQL filtering queries
with minimum effort in the back-end service implementation.
Features
Some of the sqlalchemy-filtering utility features include:
| Category | Feature | PostgreSQL | MySQL | SQLite |
|---|---|---|---|---|
| Filtering | Ability to filter simple SQL fields | Yes | Yes | Yes |
Ability to filter json SQL fields |
Yes | Yes (Beta) | No | |
| Ability to filter join queries | No | No | No | |
| Sorting | Ability to sort simple SQL fields | Yes | Yes | Yes |
Ability to sort json SQL fields |
Yes | Yes (Beta) | No | |
| Ability to sort on joined fields | No | No | No |
Usage
Given the following SQLAlchemy models:
from sqlalchemy import Column, Integer, String, DateTime, Float
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import functions
Base = declarative_base()
class UserInfo(Base):
__tablename__ = "user_info"
id = Column(Integer, primary_key=True, index=True)
details = Column(JSONB)
creation_date = Column(DateTime, nullable=False, server_default=functions.now())
class Ratings(Base):
__tablename__ = "ratings"
id = Column(Integer, primary_key=True, index=True)
creation_date = Column(DateTime, nullable=False, server_default=functions.now())
movie_name = Column(String)
rating = Column(Float)
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from tests import models
engine = create_engine(
'postgresql://postgres:password@localhost:5432/filter'
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
db = SessionLocal()
query = db.query(models.UserInfo)
Assuming we have records in the database with the following structure:
- ID:
id(type: integer) - Details:
details(type: json)
{
"skin": "White",
"extra": {
"test": "value"
},
"gender": "Male",
"height": 188,
"last_name": "Walker",
"first_name": "Paul",
"user_details": [
{
"skill": "Fighting",
"rating": 7
},
{
"skill": "Driving",
"rating": 10
}
]
}
- Creation date:
creation_date(type: timestamp)
Filtering
# Case 1: Flat request on JSON column
obj = {
"filter": [
{
## (PostgreSQL) It returns all users that have skill 'Fighting' with rating 10
"field": "details",
"node": "user_details",
"operator": "@>",
"value": "[{\"skill\":\"Fighting\",\"rating\":10}]",
},
{
## (PostgreSQL) It returns all users that have skill 'Fighting' and any rating (in any skill) with rating 10
"field": "details",
"node": "user_details",
"operator": "@>",
"value": "[{\"skill\":\"Fighting\"},{\"rating\":10}]",
}
]
}
# Case2: Nested request in JSON nodes
obj = {
"filter": [
{
"field": "details",
"node": "extra",
"value": {
"field": "test",
"operator": "==",
"value": "value"
}
}
]
}
from sqlalchemy_filtering.filter_util import filter_apply
from sqlalchemy_filtering.operators import SQLDialect
from sqlalchemy_filtering.validators import FilterRequest
from tests import models
query = filter_apply(query=query, entity=models.UserInfo, obj=FilterRequest(obj), dialect=SQLDialect.POSTGRESQL)
Filtering operators
Filtering operators AND (and_), OR (or_) and NOT (not_) are supported and can be used all together.
obj3 = {
"filter": {
"not": [
{
"field": "movie_name",
"operator": "==",
"value": "The Dark Knight"
},
{
"field": "rating",
"operator": "==",
"value": 7
}
]
}
}
Sorting
# Case 1: Sort request on JSON column
obj = {
"sort": [
{
"field": "details",
"node": "height",
"direction": "desc",
"nullsLast": True
}
]
}
# Case 2: Sort request on inner JSON node column
obj = {
"sort": [
{
"field": "details",
"node": "extra.test",
"direction": "desc",
"nullsLast": True
}
]
}
# Case 3: Sort request on simple column
obj = {
"sort": [
{
"field": "creation_date",
"direction": "desc",
"nullsLast": True
}
]
}
from sqlalchemy_filtering.sort_util import sort_apply
from sqlalchemy_filtering.validators import SortRequest
from tests import models
query = sort_apply(query=query, entity=models.UserInfo, obj=SortRequest(obj))
Comparison operators
The list of the available comparison operators can be found below:
is(aliases:==,eq)is_not(aliases:!=,ne)is_nullis_not_null>(alias:gt)<(alias:lt)>=(alias:ge)<=(alias:le)likenot_likeilikenot_ilikeinnot_incontainsanymatchstarts_with
PostgreSQL specific JSON operators
@><@@?@@
Versions tested
| System | Version |
|---|---|
| PostgreSQL | 9.2, 12.7 |
| MySQL | 8.0.20, 8.0.27 |
| SQLite | 3.37 |
| SQLAlchemy | >= 1.4.0 |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sqlalchemy-filtering-0.1.2.tar.gz.
File metadata
- Download URL: sqlalchemy-filtering-0.1.2.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7679daeaee4e07ab90e7f721498c4ae431db74596279545fa252361d3f2188a5
|
|
| MD5 |
efbc7272af0a37870500f7aaf0099226
|
|
| BLAKE2b-256 |
42d6a33a2dfa6a74c418403d9c16474ee4f88c1f021527979d599d12785c6f67
|
File details
Details for the file sqlalchemy_filtering-0.1.2-py3-none-any.whl.
File metadata
- Download URL: sqlalchemy_filtering-0.1.2-py3-none-any.whl
- Upload date:
- Size: 13.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c0accce0ab86d84a583a47ca9862cd2e6e6a4e9c08fea84a7ba64569b9bc16c
|
|
| MD5 |
4e3885c6d51fb8bab3964e3f6a9d74dc
|
|
| BLAKE2b-256 |
4e87b80322534453536aa815f50ac619b68f4e7761603a773d8bdda2dedf89da
|