Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Django regexp在字段中_Mysql_Sql_Regex_Django_Mariadb - Fatal编程技术网

Mysql Django regexp在字段中

Mysql Django regexp在字段中,mysql,sql,regex,django,mariadb,Mysql,Sql,Regex,Django,Mariadb,我有一个模型: class M(Model): re = CharacterField(max_length=50, blank=true) 例如,在表I中: table m ---------------- | id | re | ---------------- | 1 | \d+ | | 2 | \:abc | ---------------- 我想通过存储在re字段中的regexp查找与输入字符串(inp)匹配的对象,请参见示例: inp = ":a

我有一个模型:

class M(Model):
    re = CharacterField(max_length=50, blank=true)
例如,在表I中:

table m
----------------
| id  |  re    |
----------------
|  1  |  \d+   |
|  2  |  \:abc |
----------------
我想通过存储在
re
字段中的regexp查找与输入字符串(
inp
)匹配的对象,请参见示例:

inp = ":abc"
for m in M.objects.all():
    if re.match(m.re, inp)
        print("{} matched".format(m.id)) # 2 matched

但是否可以在DB服务器上执行
匹配
?因此,将
.all()
替换为“.filter”,并使用一些表达式?

对于正则表达式匹配,您需要在
过滤器中的fieldname之后使用
\uu iregex
调用:

    M.objects.filter(re__iregex=inp)
请查看以获取更多信息


编辑

如果要执行反向操作(检查数据库中保存的任何正则表达式是否与您的值匹配),则不能使用简单的
过滤器
,但可以定义自定义


请看一下这一点。

首先,
\d
不是由MySQL处理的。改为使用
[0-9]
[[:digit:]

其次,要在SQL中执行regexp,请构造应用程序

'[0-9]+|:abc'
然后将其构建到查询中

但您可能希望锚定regexp:

'^([0-9]+|:abc)$'

iregex
正向工作-当表中的列与某个正则表达式匹配时,我需要反向操作-某个值与列中的正则表达式匹配。我尝试了
M.objects.filter(re_uiregex=“123”).first()
,它返回
None
,但应该返回
1
,因为
123
匹配在
\d+
下。谢谢,这是一个有趣且信息丰富的解决方案,有一个问题:它会先从db中选择all,然后在python中找到匹配的对象吗?我的目标是在DB服务器上执行正则表达式匹配(我认为,若表中有许多行,那个么从DB服务器获取所有RAW将并没有效率)。似乎django没有这样的过滤器,所以我需要对
where
子句应用一些额外的内容,比如
'where{}REGEXP m.re'.format(inp)
,我稍后会尝试。是的-它将按照您所说的方式(首先选择全部,然后在python级别进行过滤)-效率取决于行数。如果您想在DB上执行您自己的select,您可以使用Method感谢您关于
\d
的通知,我使用的是MariaDB服务器,它应该支持PCRE regexps。我的任务是找到
m
表中存储的
re
中与某些输入字符串匹配的行,系统管理员可以输入许多行,它们可以有不同的表达式-2行是非常简化的示例,用于简化问题,没有实际价值,只是技术性的。
'^([0-9]+|:abc)$'
for m in M.objects.filter().extra(where=["'{}' RLIKE `m`.`re`".format(inp)])
    print("{} matched".format(m.id))