MysqlRewinder

MysqlRewinder is a simple, stable, and fast database cleaner for mysql.
Features
- Fast cleanup using
DELETEquery - Supports multi-database
- Supports both
mysql2andtrilogyas a client library - Works without ActiveRecord
- Works with
fork
How does it work?
- Capture SQL statements during test execution and extract
INSERTed table names, and record them into temporary files - Aggregate tmp files and execute DELETE query for
INSERTed 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 'mysql2' # described later
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 yourGemfile - Pass
adapter: :mysql2toMysqlRewinder.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_nameandActiveRecord::Base.internal_metadata_table_nametoMysqlRewinder.setupasexcept_tables
db_configs = ActiveRecord::Base.configurations.configs_for(env_name: 'test').map(&:configuration_hash)
except_tables = [
ActiveRecord::Base.,
# for AR >= 7.1
ActiveRecord::SchemaMigration.new(nil).table_name,
# for AR < 7.1
# ActiveRecord::SchemaMigration.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
- Thank you @aeroastro for the idea of using temporary files
- This gem is heavily inspired by amatsuda/database_rewinder.