2015-03-02 61 views
1

我使用Django与PostgreSQL数据库的正则表达式和这个查询工作正常:Django的:SQLite和查询

REQUEST_TYPE_ENTRANCE = 1 
REGEX_ENTRANCE = r'^{0},|,{0},|,{0}$|^{0}$'.format(
    REQUEST_TYPE_ENTRANCE 
) 
entrance_registers = EntranceRegister.objects.filter(authorized_requests__regex=REGEX_ENTRANCE) 

但是,当我运行SQLite数据库测试中,它不返回任何结果。

这里是print EntranceRegister.objects.filter(authorized_requests__regex=REGEX_ENTRANCE).query输出:

SELECT "porter_entranceregister"."id", "porter_entranceregister"."status", "porter_entranceregister"."authorized_requests", "porter_entranceregister"."gone_at", "porter_entranceregister"."created_at" 
FROM "porter_entranceregister" 
WHERE "porter_entranceregister"."authorized_requests" 
REGEXP ^1,|,1,|,1$|^1$ ORDER BY "porter_entranceregister"."created_at" 
DESC 

我想,这个问题可能是在这里失踪报价:https://github.com/django/django/blob/master/django/db/backends/sqlite3/base.py#L129,但是当我在我的virtualenv修改了这个文件,它失败

ProgrammingError: Incorrect number of bindings supplied. The current statement uses 6, and there are 7 supplied. 
+0

它的工作原理'? – FeedTheWeb 2015-03-02 15:34:58

+0

@lxer它返回:''OperationalError:无法识别的令牌:“^”'' – vero4ka 2015-03-02 15:44:13

回答

0

默认情况下,SQLite没有实现REGEXP操作符。 (如果是这样,第二个操作数将由字符串必须。)

你可以得到喜欢同样的效果:当您运行`./manage dbshel​​l命令

... WHERE reqs LIKE '1,%' OR reqs LIKE '%,1,%' OR reqs LIKE '%,1' OR reqs = '1' 
+0

因此事实证明,Django并没有以正确的方式使用它https://github.com/django/django/blob/master/django/ db/backends/sqlite3/base.py#L129,因为这个SQL是由Django ORM生成的 – vero4ka 2015-03-02 18:06:26

+1

我刚刚发现提供REGEXP函数的SQLite扩展https://github.com/ralight/sqlite3-pcre – vero4ka 2015-03-02 20:51:02