Как вы создаете подготовленные инструкции с помощью mysql2 gem?
Я пробовал использовать Google, чтобы ответить на этот, казалось бы, простой вопрос, но, к моему удивлению, это не помогло.
У меня есть код в моем приложении rails, в настоящее время использующем метод "подготовить" с камнем mysql. При переключении на mysql2 это прерывается с ошибкой:
undefined method `prepare' for #<Mysql2::Client::0.......
Итак, я попытался найти версию метода "подготовить", но этот поиск пока не увенчался успехом. Может ли кто-нибудь помочь мне с этим?
Изменить: если это невозможно, может ли кто-нибудь сообщить мне, есть ли способ просто параметризовать мои запросы чем-то в библиотеке mysql2?
Ответы
Ответ 1
Драка mysql2
теперь поддерживает подготовленные операторы в соответствии с документацией.
Синтаксис выглядит следующим образом:
statement = @client.prepare("SELECT * FROM users WHERE login_count = ?")
result1 = statement.execute(1)
result2 = statement.execute(2)
Это было добавлено с запросом на объединение в июне 2015 года.
Ответ 2
UPDATE
Как Ryan Rapp указал правильно, mysql2 теперь поддерживает подготовленные операторы. Следующий фрагмент извлекается из readme:
statement = @client.prepare("SELECT * FROM users WHERE login_count = ?")
result1 = statement.execute(1)
result2 = statement.execute(2)
statement = @client.prepare("SELECT * FROM users WHERE last_login >= ? AND location LIKE ?")
result = statement.execute(1, "CA")
Спасибо, Райан!
Оригинальная публикация
Я тоже не нашел такой функции; ни в источник, ни в документации.
Может быть, следующий фрагмент полезной замены для ваших нужд? (найдено в документации по gem mysql2):
escaped = client.escape("gi'thu\"bbe\0r's")
results = client.query("SELECT * FROM users WHERE group='#{escaped}'")
Ответ 3
Я поменялся, чтобы использовать https://github.com/tmtm/ruby-mysql вместо mysql2. Я удивлен, что это не большой разбойник для людей, использующих драгоценный камень mysql2. Я думаю, люди, которые копают это глубоко в написании SQL, поменялись на Postgresql?
Если у других возникли проблемы с gem install ruby-mysql
, за которыми следует require "mysql"
, где вы получаете ошибку Ruby, например 'read_eof_packet': packet is not EOF (Mysql::ProtocolError)
, трюк равен gem uninstall ruby-mysql
и вместо этого gem install ruby-mysql-ext
(или используйте gem 'ruby-mysql-ext'
в Gemfile) который заменит реализацию Ruby, которая еще не совместима с Ruby 2.0 (или, по крайней мере, не работает для меня) для простых привязок C.
Чтобы быть ясным, если вы выполняете require 'mysql'
, пока установлены оба ruby-mysql-ext
и ruby-mysql
, он загрузит версию Ruby. Там может быть способ требовать в определенном драгоценном камне, но у меня не было времени на это.
Ответ 4
Да, адаптер mysql2 не поддерживает привязку до текущего Rails 4.0. Я удивляюсь! Вы можете сказать это с помощью кода snip от ~/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active_record/connection_adapters/mysql2_adapter.rb
def exec_query(sql, name = 'SQL', binds = [])
result = execute(sql, name)
ActiveRecord::Result.new(result.fields, result.to_a)
end
alias exec_without_stmt exec_query
# Returns an ActiveRecord::Result instance.
def select(sql, name = nil, binds = [])
exec_query(sql, name)
end
также это полезно для вас:
(в ~/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb)
# Returns an ActiveRecord::Result instance.
def select_all(arel, name = nil, binds = [])
if arel.is_a?(Relation)
relation = arel
arel = relation.arel
if !binds || binds.empty?
binds = relation.bind_values
end
end
select(to_sql(arel, binds), name, binds)
end
Что это! И я думаю, я могу обратиться к Postgres!
Ответ 5
Я также удивлен, что метод подготовки отсутствует. Разумеется, в общей настройке ActiveRecord и Mysql2 ActiveRecord должен избегать строк, а затем использовать libmysql, и я нахожу, что это немного беспокоит.
В то же время вы можете использовать https://github.com/brianmario/mysql2/tree/stmt
Ответ 6
Рельсы и адаптер Active Record для MySQL не имеют поддержки для подготовленных операторов, насколько мне известно:
http://patshaughnessy.net/2011/10/22/show-some-love-for-prepared-statements-in-rails-3-1
Это связано с тем, что они фактически не используют ускорение операторов и могут фактически замедлить работу из-за отсутствия планирования запросов MySQL.
Ответ 7
Вы также можете использовать mysql2-cs-bind gem:
https://github.com/tagomoris/mysql2-cs-bind