基本JSON->SQLAlchemy查询生成器

jsonquer的Python项目详细描述


jsonquery

https://travis-ci.org/numberoverzero/jsonquery.svg?branch=masterhttps://coveralls.io/repos/numberoverzero/jsonquery/badge.png?branch=master

基本JSON->;sqlalchemy查询生成器

安装

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"
        ]
    }
}

贡献者

1.0.0

  • 首次公开发行

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Java中运行时在两个枚举类之间切换   java如何让PicoContainer启动/停止/处置工厂注入的组件?   带有Recyclerview onClick的java多活动   java如何从TestNG tests和Selenium接口调用默认方法?   java无法在Eclipse3.5.2中折叠注释   RR和SJF CPU调度算法的Java代码   java从属性文件配置记录器   java Notify传输在字符更改后超过20个字节完成   java阵列究竟是如何工作的   java跨类/包维护全局但可变的变量   java向setMessageListener注册侦听器服务   java按钮单击不在片段中工作   java GSSExException:使用spnego在GSSAPI上未指定故障(机制级别:不支持/启用带有HMAC SHA196的加密类型AES256CTS模式)   用java绘制虚线的图形   java从networkdrive启动windows捆绑包使用不包括JRE?   多线程java线程体系结构与应用程序设计