ActiveRecord :: Base.connection.execute выполняет только один оператор за один раз? - PullRequest
2 голосов
/ 02 февраля 2010

У меня есть куча операторов SQL для выполнения в базе данных. (Насколько я знаю, я делаю вещи, для которых Rails не предоставляет методы: создание представлений, добавление внешних ключей и т. Д. В основном это не для взаимодействия с Rails с данными.) следующее:

sql = "statement_1; statement_2; statement_3; etc;"
ActiveRecord::Base.connection.execute(sql)

Или с символами новой строки, например:

sql = <<EOF
statement_1;
statement_2;
statement_3;
etc;
EOF
ActiveRecord::Base.connection.execute(sql)

(Очевидно, что эти заявления просто заполнители, но я не думаю, что их содержание имеет значение, согласно моим тестам.)

В любом случае выполняется только первый оператор, а остальные, похоже, игнорируются. Это то, что происходит? Я вижу только эффекты первого утверждения, когда пытаюсь использовать более одного. Нужно ли выполнять каждый из них отдельно? Один набор операторов исходит из файла, поэтому было бы неплохо просто загрузить содержимое файла и выполнить. Если бы у меня были лучшие стратегии, я бы заинтересовался ими.

Я надеялся, что документация по execute проливает некоторый свет, но, кроме использования единственного числа («оператор»), этого не происходит. Возможно это из-за движка базы данных, который я использую? (Для справки, я сейчас использую SQLite.)

ОБНОВЛЕНИЕ: Я закончил тем, что написал метод, который делает следующее:

def extract_sql_statements(sql)
  statements = []

  sql.split(';').each do |statement|
    statement.strip!

    unless statement.empty?
      statement += ';'
      statements << statement
    end
  end

  return statements
end

... и затем цикл statements. Проблема исправлена, но если есть более элегантные решения, мне было бы интересно узнать о них.

1 Ответ

1 голос
/ 02 февраля 2010

Если вы посмотрите на код rails, то обнаружите, что метод execute запускает переданный sql, поэтому он, по сути, должен выполнять все ваши запросы, пока они ';разделены и действительны.

РЕДАКТИРОВАТЬ: Извините!Нет, не будет, потому что добавит ';'между строкой запроса и жалобой на неправильный синтаксис

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