Как вы создаете готовые операторы с помощью самоцвета mysql2? - PullRequest
15 голосов
/ 28 марта 2012

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

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

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

Поэтому я попытался найти версию метода «prepare», но этот поиск пока не удался.Может ли кто-нибудь помочь мне с этим?

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

Ответы [ 7 ]

14 голосов
/ 28 марта 2012

ОБНОВЛЕНИЕ

Как правильно указал Райан Рапп , 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")

Спасибо, Райан!

Исходное сообщение

Я не нашел такогофункция либо;ни в источнике , ни в документации .Может быть, следующий фрагмент полезной замены для ваших нужд?(найдено в документации по mysql2 gem):

escaped = client.escape("gi'thu\"bbe\0r's")
results = client.query("SELECT * FROM users WHERE group='#{escaped}'")
6 голосов
/ 29 октября 2015

Gem mysql2 теперь поддерживает подготовленные операторы согласно документации .

Синтаксис следующий:

statement = @client.prepare("SELECT * FROM users WHERE login_count = ?")
result1 = statement.execute(1)
result2 = statement.execute(2)

Это было добавлено с объединенным пулл-запросом в июне 2015 года.

3 голосов
/ 23 марта 2013

Я поменялся местами, чтобы использовать 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 (или, по крайней мере, у меня не работает) для простых привязок Си.

Для ясности, если вы выполните require 'mysql', когда установлены и ruby-mysql-ext, и ruby-mysql, будет загружена версия Ruby.Может быть, есть способ требовать в конкретном драгоценном камне, но у меня не было времени его искать.

1 голос
/ 02 июля 2014

Да, адаптер mysql2 не поддерживает привязку до текущей версии Rails 4.0. Я удивляюсь! Вы можете сказать это по фрагменту кода из ~ / .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 !!

0 голосов
/ 06 сентября 2014

Вы также можете использовать mysql2-cs-bind gem: https://github.com/tagomoris/mysql2-cs-bind

0 голосов
/ 29 января 2014
Насколько мне известно,

Rails и адаптер MySQL Active Record не поддерживают подготовленные операторы:

http://patshaughnessy.net/2011/10/22/show-some-love-for-prepared-statements-in-rails-3-1

Это потому, что они фактически не используютсяв ускорении операторов и может реально замедлить работу из-за отсутствия планирования запросов в MySQL.

0 голосов
/ 03 января 2014

Я также удивлен, что метод подготовки отсутствует. Конечно, в общей настройке ActiveRecord и Mysql2 ActiveRecord должен экранировать строки, а не использовать libmysql, что меня немного беспокоит.

Тем временем вы можете использовать https://github.com/brianmario/mysql2/tree/stmt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...