web-dev-qa-db-fra.com

Comment exécuter manuellement des commandes SQL dans Ruby sur Rails avec NuoDB

J'essaie d'exécuter manuellement des commandes SQL pour pouvoir accéder aux procédures dans NuoDB.

J'utilise Ruby sur Rails et j'utilise la commande suivante:

ActiveRecord::Base.connection.execute("SQL query")

La "requête SQL" peut être n'importe quelle commande SQL.

Comme par exemple, j'ai une table appelée "Feedback" et quand j'exécute la commande:

ActiveRecord::Base.connection.execute("SELECT `feedbacks`.* FROM `feedbacks`")

Cela ne ferait que renvoyer une "vraie" réponse au lieu de m'envoyer toutes les données demandées.

Voici la sortie sur la console Rails:

SQL (0.4ms)  SELECT `feedbacks`.* FROM `feedbacks`
 => true

J'aimerais utiliser ceci pour appeler des procédures stockées dans NuoDB, mais lors de l'appel des procédures, ceci renvoie également une réponse "vraie".

Est-il possible d'exécuter des commandes SQL et d'obtenir les données demandées au lieu d'obtenir une réponse "vraie"?

113
Patrick Angodung

La commande de travail que j'utilise pour exécuter des instructions SQL personnalisées est la suivante:

results = ActiveRecord::Base.connection.execute("foo")

avec "foo" étant l'instruction SQL (c'est-à-dire "SELECT * FROM table").

Cette commande retournera un ensemble de valeurs sous forme de hachage et les mettra dans la variable de résultats.

Donc sur mon Rails application_controller.rb, j'ai ajouté ceci:

def execute_statement(sql)
  results = ActiveRecord::Base.connection.execute(sql)

  if results.present?
    return results
  else
    return nil
  end
end

Utiliser execute_statement retournera les enregistrements trouvés et s'il n'y en a pas, il retournera nil.

De cette façon, je peux simplement l'appeler n'importe où sur l'application Rails, comme par exemple:

records = execute_statement("select * from table")

"execute_statement" peut également appeler des procédures, des fonctions et des vues de base de données NuoDB.

138
Patrick Angodung

Pour moi, je ne pouvais pas obtenir ceci pour retourner un hachage.

results = ActiveRecord::Base.connection.execute(sql)

Mais utiliser la méthode exec_query a fonctionné.

results = ActiveRecord::Base.connection.exec_query(sql)
94
Tim Park

Republier la réponse de notre forum pour aider les autres avec un problème similaire:

@connection = ActiveRecord::Base.connection
result = @connection.exec_query('select tablename from system.tables')
result.each do |row|
puts row
end
22
MFredrickson-NuoDB
res = ActiveRecord::Base.connection_pool.with_connection { |con| con.exec_query( "SELECT 1;" ) }

Le code ci-dessus est un exemple pour

  1. exécuter du SQL arbitraire sur votre connexion de base de données
  2. renvoyer ensuite la connexion au pool de connexions
17
Andreas Rayo Kniep