Подтвердить что ты не робот

Как вы создаете подготовленные инструкции с помощью mysql2 gem?

Я пробовал использовать Google, чтобы ответить на этот, казалось бы, простой вопрос, но, к моему удивлению, это не помогло.

У меня есть код в моем приложении rails, в настоящее время использующем метод "подготовить" с камнем mysql. При переключении на mysql2 это прерывается с ошибкой:

undefined method `prepare' for #<Mysql2::Client::0.......

Итак, я попытался найти версию метода "подготовить", но этот поиск пока не увенчался успехом. Может ли кто-нибудь помочь мне с этим?

Изменить: если это невозможно, может ли кто-нибудь сообщить мне, есть ли способ просто параметризовать мои запросы чем-то в библиотеке mysql2?

4b9b3361

Ответ 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.