#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}")