Django的。 PostgreSQL的。 regexp_split_to_table无法正常工作

时间:2012-01-18 08:15:57

标签: regex django postgresql escaping

我正在尝试使用查询来标记我的表字段。

SELECT regexp_split_to_table(mytable.field_name, E'\\s+') from mytable limit 20;

当我从psql shell执行它时,这可以工作:

from django.db import connection cursor=connection.cursor() 
cursor.execute("SELECT regexp_split_to_table(mytable.field_name,E'\\s+')
                FROM mytable LIMIT 20") 
cursor.fetchall()

......它无法返回令牌。我做错了什么?

2 个答案:

答案 0 :(得分:3)

反斜杠被Django视为元字符,并在双引号内解释。 因此,在字符串到达​​PostgreSQL服务器之前,会剥离一层E'\\s+'),这将看到E'\s+')。转义字符串将生成's+',这反过来会使regexp_split_to_table()将字符串拆分为任意数量的s,而不是非打印空间,字符类缩写为\s代表正则表达式。

将字符串中的反斜杠加倍,以达到预期效果:E'\\\\s+')

"SELECT regexp_split_to_table(field_name, E'\\\\s+') FROM mytable LIMIT 20"

作为替代方案,为避免出现反斜杠\的特殊含义问题,您可以使用[[:space:]]来表示相同的字符类:

"SELECT regexp_split_to_table(field_name, '[[:space:]]+') FROM mytable LIMIT 20"

"Pattern Matching" in the manual一章中的详细信息。

答案 1 :(得分:2)

感谢Django FFunc中的新内容以及postgresql ArrayField的supprot,您现在可以像这样调用此函数:

from django.db.models import F, Value, TextField
from django.contrib.postgres.fields import ArrayField
from django.db.models.expressions import Func

MyTable.objects.annotate(
  some_field_splitted=Func(
      F('some_field'), 
      Value(","), 
      function='regexp_split_to_array',
      output_field=ArrayField(TextField())
   )
).filter(some_field_splitted__contains=[HERE_SOME_VALUE])