2010-04-11 8 views
3

J'ai une application qui nécessite l'utilisation de MyISAM sur quelques tables, mais le reste est le type traditionnel InnoDB. L'application elle-même ne concerne pas les transactions où elle s'applique à ces enregistrements, mais la performance est une préoccupation. L'environnement de test Rails suppose que le moteur utilisé est transactionnel, cependant, lorsque la base de données de test est générée à partir de schema.rb, elle est importée avec le même moteur. Est-il possible de surmonter ce comportement d'une manière simple?Test des unités Rails avec tables MyISAM

J'ai eu recours à une bidouille terrible pour que les tables sont le type correct en adjoignant à ce test_helper.rb:

(ActiveRecord::Base.connection.select_values("SHOW TABLES") - %w[ schema_info ]).each do |table_name| 
    ActiveRecord::Base.connection.execute("ALTER TABLE `#{table_name}` ENGINE=InnoDB") 
end 

Y at-il une meilleure façon de faire un modèle soutenu MyISAM-être testables?

+0

Même problème ici - spec de coupe va recréer la base de données de test à partir de la fichier schema.rb qui ne contient pas d'options de moteur. La meilleure solution serait probablement de patcher la partie d'écriture de schéma de Rails pour ajouter les options: param à create_table() quand ce n'est pas la valeur par défaut. – simianarmy

Répondre

4

Vous pouvez modifier votre schema.rb et modifier l'appel create_table pour inclure le drapeau suivant, comme ceci:

create_table(:suppliers, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8') 

Lorsque vous créez vos migrations, essayez d'ajouter que les migrations. Je ne sais pas si cela va coller quand vous exécutez rake db: schema: dump. Compte tenu de votre expérience que l'environnement de test ne semble pas copier l'environnement de développement correctement, il ne peut pas :(

Plus d'informations sur les options create_table ici:

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M001901

+0

Modifier schema.rb est une correction à court terme car la migration suivante écrase toutes les modifications effectuées. J'espère trouver un moyen qui sera plus permanent et moins hack, mais qui ne semble pas encore pratique. – tadman

2

vous pouvez définir

self.use_transactional_fixtures = false 

dans test_helper.rb

1

Vous pouvez ajouter cette SchemaDumper de monkey-patch pour ajouter le moteur explicitement dans votre schema.r b

https://gist.github.com/1374003

Ceci est monkeypatched de Rails 2.3.14 donc aucune garantie avec Rails 3

2

Vous pouvez ajouter à application.rb:

config.active_record.schema_format = :sql 

Avec ce, le test db sera pas tout problème avec la commande rake db:test:prepare. Dans le fichier de migration, au lieu de recréer vos tables (si vous avez besoin de changer la table InnoDB existante MyISAM), vous pouvez simplement ajouter à up méthode:

execute("ALTER TABLE your_table ENGINE=MyISAM") 
Questions connexes