Ответ 1
Это работает:
@sql_stmts_array = File.read(@sql_file).lines(separator=';')
Мне нужно проанализировать файл, чтобы получить отдельные инструкции SQL и запустить их из контроллера rails.
У меня есть следующий код:
@sql_file = "#{RAILS_ROOT}/lib/evidence_interface_import.sql"
@sql_stmts_array = File.read(@sql_file).split(";")
@sql_stmts_array.each_with_index do |sql_stmt,s_index|
ActiveRecord::Base.connection.execute(sql_stmt)
end
Разделение удаляет ";" с конца SQL. Есть ли способ не удалять ";" и все еще разделить с помощью ";" .
Это работает:
@sql_stmts_array = File.read(@sql_file).lines(separator=';')
Yup, scan
it:
'a; b; c;'.scan(/[^;]*;/)
#=> ["a;", " b;", " c;"]
Вы можете избавиться от лишнего пробела, нажав на map(&:strip)
после, но он, вероятно, здесь не нужен.
Обратите внимание, что это очень рудиментарно, и что-то вроде строкового литерала в SQL с точкой с запятой в нем сломает это. (Например, select * from stuff where name = ";";
.)
При использовании ActiveRecord::Base.connection.execute
вам не нужно включать точку с запятой в первую очередь.
Кроме того, другим способом разделения без удаления разделителя является использование групп, как показано в следующем примере:
"a;b;c".split(/;/) # => ["a", "b", "c"]
"a;b;c".split(/(;)/) # => ["a", ";", "b", ";", "c"]
Используйте регулярное выражение с lookbehind
split(/(?<=;)/)
Вы можете попробовать использовать scan
с соответствующим регулярным выражением, которое должно дать вам результаты, похожие на split
, но если вы хотите придерживаться способа без регулярного выражения, вы можете просто добавить полуточку в каждую ячейку в массив:
@sql_stmts_array = File.read(@sql_file).split(";").each do |s|
s << ";"
end