MysqlRewinder
MysqlRewinder is a simple, stable, and fast database cleaner for mysql.
Features
- Fast cleanup using
DELETE
query - Supports multi-database
- Supports both
mysql2
and trilogy
as a client library - Works without ActiveRecord
- Works with
fork
How does it work?
- Capture SQL statements during test execution and extract
INSERT
ed table names, and record them into temporary files - Aggregate tmp files and execute DELETE query for
INSERT
ed tables
What does stable
mean?
MysqlRewinder is stable because it does not depend on ActiveRecord's internal implementation.
It only depends on Mysql2::Client#query
and Trilogy#query
.
Installation
Add this line to your Gemfile's :test
group:
gem 'trilogy'
gem 'mysql_rewinder'
And then execute:
$ bundle
Usage
Basic configuration
RSpec.configure do |config|
config.before(:suite) do
db_config = {
host: '127.0.0.1',
port: '3306',
username: 'user1',
password: 'my_secure_password',
database: 'myapp-test'
}
MysqlRewinder.setup([db_config])
MysqlRewinder.clean_all
end
config.after(:each) do
MysqlRewinder.clean
end
end
Multi-database
Pass all configurations to MysqlRewinder.setup
.
MysqlRewinder.setup(
[
{ host: '127.0.0.1', port: '3306', username: 'user1', password: 'my_secure_password', database: 'myapp-test-shard1' },
{ host: '127.0.0.1', port: '3306', username: 'user1', password: 'my_secure_password', database: 'myapp-test-shard2' },
]
)
mysql2
If you want to use mysql2
as a client library, do the following:
- Write
gem 'mysql2'
in your Gemfile
- Pass
adapter: :mysql2
to MysqlRewinder.setup
.
MysqlRewinder.setup(db_configs, adapter: :mysql2)
ActiveRecord
If you want to use MysqlRewinder with ActiveRecord, do the following:
- Generate db_configs from
ActiveRecord::Base.configurations
- Pass
ActiveRecord::SchemaMigration.new(nil).table_name
and ActiveRecord::Base.internal_metadata_table_name
to MysqlRewinder.setup
as except_tables
db_configs = ActiveRecord::Base.configurations.configs_for(env_name: 'test').map(&:configuration_hash)
except_tables = [
ActiveRecord::Base.internal_metadata_table_name,
ActiveRecord::SchemaMigration.new(nil).table_name,
]
MysqlRewinder.setup(db_configs, except_tables: except_tables)
Logging
If you want to enable logging, specify logger
for MysqlRewinder.setup
MysqlRewinder.setup(db_configs, logger: Logger.new(STDOUT))
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/DeNA/mysql_rewinder. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
Code of Conduct
Everyone interacting in the MysqlRewinder project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.
License
The gem is available as open source under the terms of the MIT License.
Special Thanks