Web2Py DAL - 如何检查列表:无字符串类型项目

Posted

技术标签:

【中文标题】Web2Py DAL - 如何检查列表:无字符串类型项目【英文标题】:Web2Py DAL - How to check list:string type items for None 【发布时间】:2014-06-15 13:00:20 【问题描述】:

我正在尝试查询数据集以返回所有列表:字符串项不为空。 我的示例表:

db.define_table('newItems',
            Field('name', 'string'),
            Field('tasks', 'list:string'))

对 None 的查询如下:

for item in db(db.newItems.tasks != None).select(db.newItems.tasks):

返回:

[]
[]
[u'Wash Dog', u'Mow Yard']
[]
[u'Do X', u'Then do Y']
[]

如何构造查询以使其仅返回:

[u'Wash Dog', u'Mow Yard']
[u'Do X', u'Then do Y']

谢谢

更新:

答案在 sqlite 上测试时有效,但不适用于 mongodb。空列表 [] 作为 '' 传递,会产生错误的结果:

In [4]: db.Tasks.email != []
Out[4]: <Query 'email': '$ne': ''>

mongo 外壳:

> db.Tasks.find().count()
1195 (total records)

> db.Tasks.find('email': '$ne': '').count()
1195

正确的查询应该是:

> db.Tasks.find(email: $ne: [ ] ).count()
108

这是 mongo dal 中的错误还是有其他方法可以指定空列表?

【问题讨论】:

【参考方案1】:

如果您通过SQLFORM 输入记录,task 的空值将存储为空列表而不是None,因此您可以这样做:

db(db.newItems.tasks != []).select(db.newItems.tasks)

注意,这也将排除恰好具有 taskNone 值的记录(如果您使用 .insert() 而不是 from 插入没有 task 值的记录,则可能存在)。

更新:由于 MongoDB 适配器中的错误,上述内容似乎不适用于 MongoDB。

【讨论】:

感谢您的推荐。使用上面的查询仍然会命中所有空列表。还有其他建议吗? “have”子句是否有助于检查是否为空? 嗯,我尝试的时候不会。您可以考虑在 Google Group 上发布一个显示该问题的应用,以便我们可以准确地查看您的数据库中的值。 适用于 sqlite 但不适用于 mongodb。我更新了详细说明 DAL 生成的 mongo 查询的问题。 抱歉,看起来像是 MongoDB 适配器中的错误。您可以在Google Code 上提交问题。

以上是关于Web2Py DAL - 如何检查列表:无字符串类型项目的主要内容,如果未能解决你的问题,请参考以下文章

web2py:DAL find() 不工作

如何将带有 ROWNUM、LIMIT 的 Web2Py SQL 代码翻译成 DAL?

在 web2py DAL 中查询空值

没有 web2py 的 DAL

默认情况下,级联上的 web2py 数据库抽象层 (DAL) 引用是啥?

将 MySQL 查询转换为在 web2py DAL 中使用