Django:查询中的 Sqlite 和正则表达式
Django: Sqlite and regex in query
我将 Django 与 PostgreSQL 数据库一起使用,这个查询工作正常:
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 数据库进行测试时 returns 没有结果。
这是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.
SQLite 默认不实现 REGEXP 运算符。 (如果是的话,第二个操作数必须是一个字符串。)
你可以用LIKE得到同样的效果:
... WHERE reqs LIKE '1,%' OR reqs LIKE '%,1,%' OR reqs LIKE '%,1' OR reqs = '1'
我将 Django 与 PostgreSQL 数据库一起使用,这个查询工作正常:
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 数据库进行测试时 returns 没有结果。
这是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.
SQLite 默认不实现 REGEXP 运算符。 (如果是的话,第二个操作数必须是一个字符串。)
你可以用LIKE得到同样的效果:
... WHERE reqs LIKE '1,%' OR reqs LIKE '%,1,%' OR reqs LIKE '%,1' OR reqs = '1'