Ruby: Как динамически заменять параметры в собственном PG gem

#ruby-on-rails #ruby #postgresql #pg

Вопрос:

Насколько я видел документацию по некоторым операторам, динамические операции не разрешены, например, если я хочу выполнить инструкцию

 res = conn.exec_params('CREATE DATABASE $1',[dbname])
 

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

 Error: ERROR:  syntax error at or near "$1"
LINE 1: CREATE DATABASE $1
 

в то время как если я использую оператор select SELECT * FROM pg_database WHERE datname = $1 , это утверждение выполняется успешно.

Хотя вышеуказанной проблемы не было с dbd/pg gem, но, похоже, она не была выпущена с прошлого 2010 года, что переводит динамические параметры в собственный pg, а с последними ruby и pg gem dbd/pg не работает.

Мой вопрос в том, есть ли у нас какой-либо способ с помощью собственного PG gem выполнить динамическую замену переменных с помощью create database, вставить в подобные операторы. ИЛИ есть ли какая-либо альтернатива dbd/pg, которая предлагает ту же функциональность?

Ответ №1:

Заполнители (т. е. $1 , $2 ,…) предназначены для значений. Имя базы данных (или имя таблицы, имя столбца, …) является идентификатором. Это похоже на разницу между именем переменной и значением, которое переменная содержит в Ruby.

Если вам нужно динамически вставить идентификатор в какой-либо SQL, вам необходимо использовать интерполяцию строк и метод специального назначения quote_ident , чтобы убедиться, что вы правильно его цитируете. Так что что-то более похожее на это:

 db_name = conn.quote_ident(db_name)
res     = conn.exec("CREATE DATABASE #{db_name}")