2010-02-02 5 views
2

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.

Répondre

1

Si vous regardez le code des rails, vous verrez que la méthode execute exécute le sql passé, donc il devrait essentiellement exécuter toutes vos requêtes tant qu'elles sont ';' séparé et valide.

EDIT: Désolé! Non, ce ne sera pas parce qu'il va ajouter ';' entre votre chaîne de requête et se plaindre de la mauvaise syntaxe

+0

Hrm ... c'est intéressant. Je peux cracher les instructions SQL et faire 'sqlite3 db.sqlite3

+0

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. –

+0

Peut-être en raison de dbs différents parce que j'ai essayé sur mysql et vous êtes sur sqlite – nas