Rails 3 выполняет пользовательский sql-запрос без модели
мне нужно написать автономный скрипт ruby, который должен работать с базой данных. Я использовал код, приведенный ниже в Rails 3
@connection = ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "siteconfig_development",
:username => "root",
:password => "root123"
)
results = @connection.execute("select * from users")
results.each do |row|
puts row[0]
end
но получаю ошибку:-
`<main>': undefined method `execute' for #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x00000002867548> (NoMethodError)
чего мне здесь не хватает?
решение
после получения решения от Денис-бу я использовал его следующим образом и это тоже сработало.
@connection = ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "siteconfig_development",
:username => "root",
:password => "root123"
)
sql = "SELECT * from users"
@result = @connection.connection.execute(sql);
@result.each(:as => :hash) do |row|
puts row["email"]
end
5 ответов:
может попробовать так:
ActiveRecord::Base.establish_connection(...) ActiveRecord::Base.connection.execute(...)
Я бы посоветовал использовать
ActiveRecord::Base.connection.exec_queryвместоActiveRecord::Base.connection.executeкоторый возвращает aActiveRecord::Result(доступно в rails 3.1+), с которым немного легче работать.затем вы можете получить доступ к нему в различных результата различными способами, как
.rows,.eachили.to_hashС docs:
result = ActiveRecord::Base.connection.exec_query('SELECT id, title, body FROM posts') result # => #<ActiveRecord::Result:0xdeadbeef> # Get the column names of the result: result.columns # => ["id", "title", "body"] # Get the record values of the result: result.rows # => [[1, "title_1", "body_1"], [2, "title_2", "body_2"], ... ] # Get an array of hashes representing the result (column => value): result.to_hash # => [{"id" => 1, "title" => "title_1", "body" => "body_1"}, {"id" => 2, "title" => "title_2", "body" => "body_2"}, ... ] # ActiveRecord::Result also includes Enumerable. result.each do |row| puts row['title'] + " " + row['body'] endПримечание: скопировал мой ответ из здесь
вы также можете использовать find_by_sql
# A simple SQL query spanning multiple tables Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id" > [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
Как насчет этого :
@client = TinyTds::Client.new( :adapter => 'mysql2', :host => 'host', :database => 'siteconfig_development', :username => 'username', :password => 'password' sql = "SELECT * FROM users" result = @client.execute(sql) results.each do |row| puts row[0] endвам нужно установить tinytds gem, так как вы не указали его в своем вопросе, я не использовал Active Record
Comments