J'ai un tas d'instructions SQL à exécuter sur une base de données. (Je fais des choses pour lesquelles Rails ne fournit pas de méthodes, pour autant que je sache: créer des vues, ajouter des clés étrangères, etc. C'est surtout pour l'interaction non-Rails avec les données.) Essentiellement, je fais le suivant:Est-ce que ActiveRecord :: Base.connection.execute n'exécute qu'une seule instruction à la fois?
sql = "statement_1; statement_2; statement_3; etc;"
ActiveRecord::Base.connection.execute(sql)
Ou avec les nouvelles lignes, comme ceci:
sql = <<EOF
statement_1;
statement_2;
statement_3;
etc;
EOF
ActiveRecord::Base.connection.execute(sql)
(de toute évidence, ces déclarations sont placent juste détenteurs, mais je ne pense pas que leurs questions de contenu, d'après mes tests.)
Dans les deux cas, seule la première instruction est exécutée et les autres semblent être ignorées. Est-ce que c'est ce qui se passe? Je ne vois que les effets de la première déclaration quand j'en essaye plus d'une à la fois. Ai-je besoin d'exécuter chacun séparément? Un ensemble d'instructions vient d'un fichier, donc ce serait bien de charger simplement le contenu du fichier et de l'exécuter. S'il y a de meilleures stratégies que je pourrais adopter, cela m'intéresserait. J'espérais que le documentation on execute
apporterait un peu de lumière, mais en plus d'utiliser le singulier ("statement"), ce n'est pas le cas. Peut-être que c'est à cause du moteur de base de données que j'utilise? (Pour référence, j'utilise SQLite pour le moment.)
MISE À JOUR: Je fini par écrire une méthode qui effectue les opérations suivantes:
def extract_sql_statements(sql)
statements = []
sql.split(';').each do |statement|
statement.strip!
unless statement.empty?
statement += ';'
statements << statement
end
end
return statements
end
... puis en boucle sur statements
. C'est réglé le problème, mais s'il y a des solutions plus élégantes, je serais intéressé à en entendre parler.
Hrm ... c'est intéressant. Je peux cracher les instructions SQL et faire 'sqlite3 db.sqlite3
Il ne se plaint pas du tout si ... c'est la partie étrange. Juste semble ignorer tout passé la première déclaration et échouer silencieusement. –
Peut-être en raison de dbs différents parce que j'ai essayé sur mysql et vous êtes sur sqlite – nas