2016-08-01 5 views
2

Я преобразовываю существующий проект из MySQL в Postgres. В коде есть немало необработанных SQL-литералов, которые используют ? в качестве заполнителя, например.

SELECT 
    id 
    FROM 
    users 
    WHERE 
    name = ? 

Но я получаю эту ошибку:

DB query error: error: operator does not exist: character varying = ? 

Я не хочу, чтобы преобразовать весь мой существующий SQL из ? операторов Postgres стиля как $1.

Есть ли способ, чтобы узел-postgres принимал вопросительные знаки или утилиту, которая может преобразовывать в параметры стиля postgres?

Обратите внимание, что какой-то хакерство на основе Regex неприемлемо, потому что вопросительные знаки могут быть внутри кавычек или обратная косая черта сбежала на любую глубину.

+1

Использование ссылки? в запросе это не MySQL, а уровень приложения, например. Ява. Скорее всего, это не должно измениться. Можете ли вы показать нам этот запрос в контексте кода? –

+0

Какую версию Postgres вы используете? Поскольку в документации упоминается использование '?' (Https://www.postgresql.org/docs/9.1/static/ecpg-commands.html), а также этот случайный вопрос SO (http://stackoverflow.com/questions/10659737/how-can-i-use-a-query-with-placeholder-inside-quotes-perl-postgresql) –

+1

Что такое узел-postgres и почему он не находится в тегах, поскольку он, по-видимому, является ядром вашего вопрос? – joop

ответ

1

Is there some way of having node-postgres accept the question marks instead?

NO. И нет прямого соответствия между ? и синтаксисом, потому что последнее подразумевает повторное использование параметра, в то время как ? этого не допускает. Например, использование ? ? ? подразумевает, что у вас есть 3 параметра форматирования, а $1 $2 $2 подразумевает, что у вас есть два параметра форматирования.

or an utility that can convert to postgres style params?

Невозможно, так как нет прямого соответствия, преобразование возможно только в одну сторону, что сделало бы такую ​​полезность бесполезной. Вы можете заменить все самостоятельно, с одним регулярным выражением, заменяя каждый ? на $ + index + 1.

I don't want to convert all my existing SQL from ? to postgres-style operators like $1 .

У вас на самом деле нет большого выбора. Это нужно сделать. Кроме того, $1 является более гибким, чем ?, из-за повторного использования параметров, а также дополнительных расширений. Например, pg-promise расширяет их очень хорошо, с различными модификаторами форматирования, которые необходимы часто: ^, ~, :json, :csv и т.д ...

Note that some sort of Regex-based hack is not acceptable because question marks can be inside quotes, or backslash escaped to any depth.

Вы, вероятно, тратить меньше времени конвертирования SQL вручную, чем время написания утилиты для одностороннего правильного преобразования.