104 votes

Rails 3 exécute une requête sql personnalisée sans modèle

J'ai besoin d'écrire un ruby script autonome qui est censé traiter la base de données. J'ai utilisé le code donné ci-dessous dans 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

mais je reçois une erreur:-

`<main>': undefined method `execute' for #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x00000002867548> (NoMethodError)

Qu'est-ce que j'ai manqué ici ?

SOLUTION

Après avoir obtenu la solution de denis-bu, je l'ai utilisée de la manière suivante et cela a également fonctionné.

@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

167voto

denis-bu Points 1361

Essayez peut-être ceci :

ActiveRecord::Base.establish_connection(...)
ActiveRecord::Base.connection.execute(...)

100voto

SachinR Points 3693
connection = ActiveRecord::Base.connection
connection.execute("SQL query")

38voto

hajpoj Points 5229

Je recommande d'utiliser ActiveRecord::Base.connection.exec_query au lieu de ActiveRecord::Base.connection.execute qui renvoie un ActiveRecord::Result (disponible dans rails 3.1+) qui est un peu plus facile à utiliser.

Ensuite, vous pouvez y accéder de différentes manières, comme par exemple .rows , .each ou .to_hash

De la 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

note : j'ai copié ma réponse à partir de aquí

24voto

montrealmike Points 3795

Vous pouvez également utiliser trouver_par_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"}>, ...]

4voto

ant Points 8428

Que pensez-vous de ceci :

@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

Vous devez avoir la gemme TinyTds installée, puisque vous ne l'avez pas spécifié dans votre question je n'ai pas utilisé Active Record

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X