对zombodb的sqlalchemy支持

sqlalchemy-zdb的Python项目详细描述


SqlAlchemy对zombodb的支持
==


**实验性**对带有SqlAlchemy的zombodb查询语言的支持。[sqla_uzdb]的硬分叉(https://github.com/xxxbobrxxx/sqlalchemy戆uzombodb)。

请查看[查询语法](https://github.com/skftn/sqlalchemy戆uzdb戆语法)以获取受支持表达式的示例。



---|---
postgres 9.5
elasticsearch 1.7.1+(不是2.0)
python 3.5+
zombodb 3.1.12




关键字varchar(64)[],
简短短语,
长描述全文,
价格bigint,
库存计数整数,
停止布尔默认值false,
可用性日期,
作者varchar(32)

```

sqlalchemy模型:

``python
from sqlalchemy_zdb.types import phrase,fulltext,zdb column


类产品(基):
nullable=false)
关键字=列(数组(unicode(64))
短摘要=zdbcolumn(phrase())
长描述=zdbcolumn(全文(41))
价格=zdbcolumn(bigint())
库存计数=列(integer())
终止=列(boolean(),默认值=false)
可用性日期=列(datetime())
author=zdbcolumn(unicode(32))
````

-`zdbcolumn`-显式标记zombodb索引中包含的列
-`fulltext`-zombodb特定类型
-`phrase`-zombodb特定键入

`session.metadata.create_all()`可正确创建此表。它还添加zombodb索引。

会话=会话)
q=q.filter(products.name=="foo")
q=q.filter(products.author.like("bar"))
q=q.filter(products.price.between(5,10))
q=q.filter(products.discounted==false)


results=q.all()
`````

```sql
从产品中选择[…],其中zdb('products',ctid)=>;'author:"bar"和price:5/to/10'和
products.name='foo'和products.discounted=false
````


请注意,"name"和"discounted"列都不包含在zombodb查询中,而是显示为有效的pgsql。这是因为在查询编译期间它们不是"zdbcolumn"类型。

如果决定使用此包,请仔细检查生成的SQL查询是否正确。如果出现异常行为,请提交一个问题,以便我可以查看。

'作者:"foo bar"'
```

stacking'等于'zdb column(array(string(32))'列上的条件:

``python
q=q.filter(products.keywords=="foo")
q=q.filter(products.keywords=="bar")
````
``sql
从产品中选择[…],其中zdb('products',ctid)==>;'关键字:"foo"和关键字:"bar"
``


这将匹配同时具有"foo"和"bar"关键字的行。


'price>;5'
```

``python
q=q.filter(products.price.between(5,14.5))
```

``sql
从产品中选择[…]从产品中选择[…]从产品中选择[…]从产品中选择[…]从zdb('products,ctid)==>;'price:5/到/14.5'
` `


` ` ` ` ` ` ` ` ` ` ` ` ` `从产品中选择[…]从产品中选择[…]从产品中选择[…]从产品中选择[br/>zdb('products,ctid)======================5/到/14.5/到/14.5''
` ` ` `>;"author:"foo bar"'
```

传递regex对象时,生成表达式:` column:~"foo[a-z]"`
`` python
q=q.filter(products.author.like(re.compile("foo[a-z]"))
````
``sql
从products
中选择[…],其中zdb('products',ctid)=>;"作者:~"foo[a-z]"'
```

``q=q.filter(products.author.match("foo"))
````
``sql
``select[…]from products
where zdb('products',ctid)=>;'作者:@"foo"'
```

"bar")'
```

这与名为"foo"或"bar"的两个作者都匹配。


\r/>limit

zombodb允许您限制从文本查询返回的行数,这类似于postgres的"sql-level-order-by-limit-offset"子句,但是,由于在elasticsearch和postgres之间传递的数据更少,因此效率会大大提高。

语法:

````
"limit(price asc,0,10)…"
按作者姓名asc排序;
````


要在sqlalchemy中构造这样的查询,查询对象必须接收:



1。使用"limit()"的限制
2。一个"zdbcolumn"或"zdbcore",使用"order\u by()`

示例1-使用标记为"zdbcolumn"的列(*products.price*)

``python
q=q.filter(products.author.in廑(["foo","bar"])
q=q.order廑by(products.price.desc(),
products.availability\date.desc()).limit(1)offset(1)
`````

```sql
从products
中选择[…],其中zdb('products',ctid)==>;'limit(price desc,1,1)author:("foo","bar")'
按产品订购。price desc,products.availability\date desc
``

换言之,如果以前在查询建筑中已将"limit()"与"order\by()"一起使用,并且主题列的类型为"zdbcolumn",它将尝试为它烘焙一个正确的查询。

示例2-使用sqlalchemy中的"zdbcore"zdbcore

``python
从sqlalchemy中导入zdbcore

q=q.order(zdbcore("asc"),
products.availability\u date.desc(),
products.long_description.desc())
q=q.limit(1)
q=q.offset(1)
``````

```sql
从products
中选择[…],其中zdb('products',ctid)==>;'limit('u score asc,1,1)作者:("foo","bar")'
按zdb score('products',ctid)asc订购,products.availability日期说明,products.long_u description desc
```

[zombodb文档](https://github.com/zombodb/zombodb/blob/master/syntax.md limitoffset with sorting)中的"limit"可以阅读更多内容。

可以直接使用"zdb_raw_query"。


短语查询:


from sqlalchemy_zdb import zdb_raw_query,zdbphrase

session.query(post.text)\
.filter(zdb_raw_query(post.text=='hey joe'))



从post
选择post.text作为post_text
,其中zdb('post',ctid)=>;"text:"hey joe"'


布尔查询:

pg_session.query(post.text)\
.filter(zdb_raw_query(或_u(post.text=='foo',和_u(post.text=='bar',post.text=='fuzz')))

从post
其中zdb('post',ctid)=>选择post.text作为post_text
;'(文本:"foo"或(文本:"bar"A)nd text:"fuzz")'

pg_session.query(post.text)\
.filter(zdb_raw_query(post.comments>;1))

1'

原始查询:

pg_session.query(post.text)\
.filter(zdb_raw_query(post,'text:(sports,box)或long_description:(wood w/5 away)和comments<;10'))

选择post.text作为post_text
从post
其中zdb('post',ctid)=>;'文本:(运动型,长方体)或长形描述:(木制,5英尺外)和注释<;10'




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

推荐PyPI第三方库


热门话题
java如何使用反射访问class字段类型的class变量?   swing Java:强制JFileChooser到一个目录及其子文件夹   java当我试图在maven项目中使用@ResController时,它显示错误“RestController无法解析为类型”。帮我解决这个问题   java为什么我的数字不在数组中记录和打印?   java如何将字符串参数传递给函数?   如何在java中高效地将标准输出继承到子进程?   java Eclipse,在Project Explorer视图中拥有文件属性的TreeViewer   java H2:无法从jar中的sql文件初始化DB架构   java Dispose窗口而不关闭整个程序   java专用模块和/或提供程序的简单使用   java Hibernate为下一个序列提取第二个上一个id值   调整屏幕大小时java JavaFX调整画布大小   java StringIndexOutOfBound异常   反射如何动态创建新的。java程序中的java文件?   java如何实现“带映射的Setter注入”   java如何使Spring控制器在传输所有请求主体(并将主体作为流处理)之前被调用?   java返回并持久化LinkedHashMap,而不是JPA实体中的Map   java默认情况下,时间戳是否显示在HBase表中?