基本JSON->SQLAlchemy查询生成器
jsonquer的Python项目详细描述
安装
pip install jsonquery
基本用法
让我们定义一个模型并设置一个引擎:
from sqlalchemy import Column, Integer, String, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) email = Column(String) age = Column(Integer) height = Column(Integer) engine = create_engine("sqlite://", echo=True) Base.metadata.create_all(engine) model = User session = sessionmaker(bind=engine)()
我们想让所有名字以“pat”开头的用户 至少21:
from jsonquery import jsonquery json = { "operator": "and", "value": [ { "operator": ">=", "column": "age", "value": 21 }, { "operator": "ilike", "column": "name", "value": "pat%" } ] } query = jsonquery(session, User, json) users = query.all()
支持的数据类型
jsonquery不关心列类型。取而代之的是,它使用了操作员的白名单, 其中键是字符串(与在节点的“operator”字段中传递的键相同) 值是一个函数,它接受一个列对象和一个值并返回一个 炼金术标准下面是一些例子:
def greater_than(column, value): return column > value register_operator(">", greater_than) def like(column, value): like_func = getattr(column, 'like') return like_func(value) register_operator("like", like)
默认情况下,以下内容已注册:
>, >=, ==, !=, <=, < like, ilike, in_
使用unregister_operator(opstring)删除运算符
未来目标
我想添加一些特性,但这些特性大多是方便的,不需要 核心应用程序,我相信是满意的。
压缩和/或格式
通过允许非标量值,尽可能减少重复的列和运算符规范 对于列运算符通过翻转对逻辑运算符的嵌套限制,我们可以省略 在列级别指定的字段。这在字符串匹配中尤为突出, 当列和运算符相同,但我们希望与3+值进行比较时。
当前:
{ "operator": "or", "value": [ { "column": "age", "operator": "<=", "value": 16 }, { "column": "age", "operator": ">=", "value": 21 }, { "column": "age", "operator": "==", "value": 18 } ] }
使用压缩逻辑运算符:
{ "column": "age" "value": { "operator": "or", "value": [ { "operator": "<=", "value": 16 }, { "operator": ">=", "value": 21 }, { "operator": "==", "value": 18 } ] } }
或者,当操作员相同时:
{ "column": "name" "operator": "like" "value": { "operator": "or", "value": [ "Bill", "Mary", "Steve" ] } }