Джанго.PostgreSQL.regexp_split_to_table не работает - PullRequest
3 голосов
/ 18 января 2012

Я пытаюсь токенизировать поля таблицы с помощью запроса.

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

Это работает, когда я запускаю его из оболочки psql, но когда я делаю:

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 ]

3 голосов
/ 18 января 2012

Обратная косая черта трактуется Джанго как метасимвол и интерпретируется внутри двойных кавычек.Таким образом, один слой E'\\s+') удаляется до того, как строка поступит на сервер PostgreSQL, который увидит 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"

Подробности в главе «Сопоставление с образцом» в руководстве .

2 голосов
/ 17 января 2017

Благодаря новым в Django F, Func и supprot для postgresql ArrayField теперь вы можете вызывать эту функцию следующим образом:

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...