DSL旨在表示对b3j0f.crudity的请求。
j1bz.expression的Python项目详细描述
摘要
说明
expression是一种领域特定语言(dsl),用于表示crud查询。 对于b3j0f.crudity(https://github.com/b3j0f/requester/)
换言之,你可以写一些粗糙的表达
粗鲁的表情,酷!但是…这是什么?
此软件包的设计与 b3j0f.requester,所以在继续之前应该知道它是什么
在b3j0f.requester中,所有内容都是Expression(E)或 Function(F)。如果要比较a和b,则需要编写 :
>>>F('>',params=[E.a,E.b])
程序员可以毫无问题地操作这些嵌套的函数调用,但是 技术背景较低的人会发现做这件事有困难。 j1bz.expression旨在使b3j0f.requester调用更容易访问。这个 语法的灵感来自于sql,因为任何it人员都应该在 至少有几个SQL查询,不应丢失:
>>>interpret("SELECT ALL WHERE (a > b);")
语法比本机b3j0f.requester允许的更严格 待办事项(包括主要需求)。因此,用户被激励去写 有道理。
j1bz.expression.intepreter.interpret返回 b3j0f.requester.request.crud.{create.Create,read.Read,update.Update,delete.Delete} 序列化对象(取决于查询)。然后可以通过 任何司机。
安装
aptitude install git virtualenv virtualenv venv source venv/bin/activate git clone https://github.com/b3j0f/requester cd requester python setup.py install pip install j1bz.expression expression-cli
如何
快速启动
>>>fromj1bz.expression.interpreterimportinterpret>>>res=interpret("SELECT a;")>>>print(repr(res))SELECTa
注释:j1bz.expression.exceptions.ParseError应该是唯一的 在按原样调用解释函数时必须捕获异常
表达式示例
创建
INSERT VALUES k:v; INSERT VALUES k1:v1, k2:v2; INSERT INTO i VALUES k:v; INSERT VALUES k:v; AS i
注释:CREATE是INSERT的同义词。意思是每次你能 使用INSERT您可以使用CREATE代替(在某些 案例)。
CREATE VALUES k:v;
读取
SELECT ALL; SELECT s; SELECT s WHERE w; SELECT s GROUP BY g; SELECT s ORDER BY o; SELECT s LIMIT 10; SELECT s; AS mys SELECT s WHERE wh GROUP BY g ORDER BY o LIMIT 10; AS mys SELECT a, b, c; SELECT f(); SELECT f(a, b, c); SELECT s WHERE (a); SELECT s WHERE (a= b); SELECT s WHERE (a != b); SELECT s WHERE (a > b); SELECT s WHERE (a >= b); SELECT s WHERE (a < b); SELECT s WHERE (a <= b); SELECT s WHERE (a IN b); SELECT s WHERE (a NIN b); SELECT s WHERE (a LIKE b); SELECT s WHERE (a AND b); SELECT s WHERE (a OR b); SELECT s WHERE (a OR (b AND c)); SELECT s ORDER BY o1, o2; SELECT s ORDER BY o1 DESC, o2, o3 ASC;
注释:READ是SELECT的同义词。
READ ALL;
更新
UPDATE VALUES k:v; UPDATE VALUES k:v WHERE w; UPDATE VALUES k:v; AS myu UPDATE INTO u VALUES k:v; UPDATE INTO u VALUES k:v WHERE w; UPDATE INTO u VALUES k1:v1, k2:v2;
删除
DELETE d; DELETE d1, d2, d3; DELETE d WHERE w; DELETE d1, d2, d3 WHERE w; DELETE d; AS myd
note:表达式使用grako(https://pypi.python.org/pypi/grako)来 从中定义的语法生成语法分析器 {{ PACKAGE }}/etc/j1bz/expression/grammar.bnf你可以读这个bnf 检查所有可用可能性的说明。
高级操作
如果您想在代码中集成j1bz.expression,则不仅仅是为了 interpret()调用,这部分是给您的。
使用自定义语法
为j1bz.expression供电的引擎是grako。格拉科(语法 Kompiler)在输入中获取一个bnf派生的语法文件,并在 python代码。
这个包嵌入了一个语法文件和一个从 这个语法({{ PACKAGE }}/etc/j1bz/expression/grammar.bnf)
可以更改此语法并使用在运行时为 您的interpret()呼叫:
>>>interpret("SELECT a;","/PATH/TO/grammar.bnf")
note:第一次调用interpret()后(使用或 如果没有语法文件),则将使用第一次使用的同一解析器 后来(由于一个单身机修工)。
口译员vs口译
interpret()使用单例机制提供快捷方式
如果你想做更复杂的事情,你可以使用 j1bz.expression.interpreter.Interpreter类
示例:
>>>i1=Interpreter(parser=mygrakoparser,walker=mycustomwalker)>>>i1.interpret("SELECT a;")>>>i2=Interpreter(pkwargs={'rule_name':'condition'})>>>i2.interpret("(a > b)")>>>i3=Interpreter(grammar_file='/PATH/TO/grammar.bnf')>>>i3.interpret("SELECT_ALIAS a;")
注意:grammar_file参数只有在没有提供 通过parser参数自定义解析器。
异常处理
j1bz.expression.exceptions当前定义了两个异常:
- ParserGenerationError:在中提供自定义语法时引发 命令生成语法分析器,但生成失败(语法不是 正确!).
- ParseError:当给定给interpret()的表达式不是 可分解的。
其他一些E异常(IOError,OSError,FileNotFoundError)可以 如果语法文件是 不可读、不存在等
如果只使用interpret()快捷方式,则应处理 上述例外情况
如果您使用的是Interpreter类,则需要处理 ParserGenerationError(以及与文件相关的异常)当您实例化它时 当您进行interpret()调用时,ParseError。