{"id":40968384,"url":"https://github.com/josephspurrier/rove","last_synced_at":"2026-01-22T06:28:07.696Z","repository":{"id":57514747,"uuid":"149832376","full_name":"josephspurrier/rove","owner":"josephspurrier","description":"MySQL Database Migration Tool Inspired by Liquibase in Go/Golang","archived":false,"fork":false,"pushed_at":"2019-05-13T12:50:12.000Z","size":164,"stargazers_count":23,"open_issues_count":7,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-06-21T03:23:13.470Z","etag":null,"topics":["database-migrations","go","liquibase"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/josephspurrier.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-09-22T00:36:53.000Z","updated_at":"2023-07-23T15:53:25.000Z","dependencies_parsed_at":"2022-09-26T18:00:54.043Z","dependency_job_id":null,"html_url":"https://github.com/josephspurrier/rove","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/josephspurrier/rove","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Frove","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Frove/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Frove/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Frove/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/josephspurrier","download_url":"https://codeload.github.com/josephspurrier/rove/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josephspurrier%2Frove/sbom","scorecard":{"id":533612,"data":{"date":"2025-08-11","repo":{"name":"github.com/josephspurrier/rove","commit":"6843a2df19ca9521711fbfa7b84b628746454c3e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating golang:latest to golang:latest@sha256:9e56f0d0f043a68bb8c47c819e47dc29f6e8f5129b8885bed9d43f058f7f3ed6","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-20T06:20:52.340Z","repository_id":57514747,"created_at":"2025-08-20T06:20:52.340Z","updated_at":"2025-08-20T06:20:52.340Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28656841,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-migrations","go","liquibase"],"created_at":"2026-01-22T06:28:06.865Z","updated_at":"2026-01-22T06:28:07.684Z","avatar_url":"https://github.com/josephspurrier.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rove\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/josephspurrier/rove)](https://goreportcard.com/report/github.com/josephspurrier/rove)\n[![Build Status](https://travis-ci.org/josephspurrier/rove.svg)](https://travis-ci.org/josephspurrier/rove)\n[![Coverage Status](https://coveralls.io/repos/github/josephspurrier/rove/badge.svg?branch=master\u0026timestamp=20190115-01)](https://coveralls.io/github/josephspurrier/rove?branch=master)\n[![GoDoc](https://godoc.org/github.com/josephspurrier/rove?status.svg)](https://godoc.org/github.com/josephspurrier/rove)\n\n## MySQL Database Migration Tool Inspired by Liquibase\n\nThe primary motivation behind this tool is to provide a simple and quick Go (instead of Java) based database migration tool that allows loading migrations from anywhere, including from inside your code so you can distribute single binary applications. You write the migration and rollback SQL, Rove will apply it for you properly.\n\n### How do migrations work?\n\nDatabase migrations are necessary when you make changes to your applications. You may need a new table or a new column so you have to write the SQL commands to make the changes. The tricky piece is when you perform an upgrade, how do you manage which SQL queries will run? Do you run all of them again and then the new ones after? Or is there an easy way to track which queries have been run so you only run new ones? What if you have to rollback your database because of a feature that was released too early and is causing problem? How do you manage those queries? You can definitely write your own code to manage the migration process, but Rove makes the process much easier for you. You also don't have to convert your SQL code to a another format like JSON or XML, you can just add a few comments around it and Rove will handle the rest.\n\n### How does Rove work?\n\nYou'll need to write your changes queries and rollback queries in migration files. These are plain SQL files that can be imported directly into MySQL. Rove just uses comments to help break them into smaller manageable pieces. When you run tell Rove to apply your changes, a table called `rovechangelog` is created in the database to track which changesets have been applied and metadata about them. The tool will ensure no changes have been made to the existing changesets that are already in the database. Changeset checksums are then compared against the changelog table checksums. Any new changesets that are not in the changelog are applied to the database and then a new record is inserted into the changelog for each changeset. Rove supports labeling changesets with a `tag` as well as rolling back to specific tags.\n\n### Rove vs Liquibase\n\nRove and Liquibase use different changelog tables. Rove includes MySQL out of the box, but it supports adding your own adapters to work with any type of data storage. The Rove changesets can use a very similar plain SQL (no XML or JSON) file format for simplicity and portability. For the most teams, you'll be able use your existing SQL migration files with Rove without making any changes.\n\nTo assist with switching from Liquibase to Rove, you can use the CLI tool with the `rove convert` argument to convert a Liquibase `DATABASECHANGELOG` table to a Rove `rovechangelog` table. If you don't run the `rove convert` command first on a database that was originally managed by Liquibase, Rove will try to rerun the same migrations over again if you use the same migration files. The tools use different changelog table names, table schemas, and use different methods for calculating their checksums.\n\n## Dependencies\n\nThese are the dependencies required to build Rove.\n\n```\ngopkg.in/alecthomas/kingpin.v2\ngithub.com/go-sql-driver/mysql\ngithub.com/jmoiron/sqlx\ngithub.com/stretchr/testify/assert\n```\n\n## Quick Start with Docker Compose\n\nYou can build a docker image from this repository and set it up along with a MySQL container using Docker Compose.\n\n```bash\n# Create a docker image.\ndocker build -t rove:latest .\n\n# Launch MySQL and the Rove tool with Docker Compose.\ndocker-compose up\n\n# The database should now have the sample migrations applied.\n\n# Shutdown the containers.\ndocker-compose down\n```\n\n## Testing Migrations in MySQL Docker\n\nUse the following commands to start a MySQL container with Docker:\n\n```bash\n# Start MySQL without a password.\ndocker run -d --name=mysql57 -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.7\n# or start MySQL with a password.\ndocker run -d --name=mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=somepassword mysql:5.7\n\n# Create the database via docker exec.\ndocker exec mysql57 sh -c 'exec mysql -uroot -e \"CREATE DATABASE IF NOT EXISTS webapi DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;\"'\n# Or create the database manually.\nCREATE DATABASE webapi DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;\n\n# Build the CLI tool.\ngo install\n\n# Apply the database migrations without a password.\nrove all testdata/success.sql --hostname=127.0.0.1 --port=3306 --username=root --name=webapi\n# or apply the database migrations with a password.\nrove all testdata/success.sql --hostname=127.0.0.1 --port=3306 --username=root --password=somepassword --name=webapi\n```\n\n## Rove Usage\n\nThe Rove package can be used as a standalone CLI application or you can import the package into your own code.\n\n### Rove via CLI\n\nThe Rove CLI app uses [Kingpin](https://github.com/alecthomas/kingpin) to handle command-line parsing. To view the info on any of the commands, you can use `--help` as an argument.\n\nHere are the commands available:\n\n```\nusage: rove [\u003cflags\u003e] \u003ccommand\u003e [\u003cargs\u003e ...]\n\nPerforms database migration tasks.\n\nFlags:\n  --help                         Show context-sensitive help (also try --help-long and --help-man).\n  --checksum-mode=CHECKSUM-MODE  Set how to handle checksums that don't match [error (default), ignore, update].\n  --hostname=HOSTNAME            Database hostname or IP [string].\n  --port=PORT                    Database port [int].\n  --username=USERNAME            Database username [string].\n  --password=PASSWORD            Database password [string].\n  --name=NAME                    Database name [string].\n  --parameter=PARAMETER          Database parameters [string].\n  --envprefix=ENVPREFIX          Prefix for environment variables.\n\nCommands:\n  help [\u003ccommand\u003e...]\n    Show help.\n\n  all \u003cfile\u003e\n    Apply all changesets to the database.\n\n  up \u003ccount\u003e \u003cfile\u003e\n    Apply a specific number of changesets to the database.\n\n  reset \u003cfile\u003e\n    Apply all rollbacks to the database.\n\n  down \u003ccount\u003e \u003cfile\u003e\n    Apply a specific number of rollbacks to the database.\n\n  tag \u003cname\u003e \u003cfile\u003e\n    Apply a tag to the latest changeset in the database.\n\n  rollback \u003cname\u003e \u003cfile\u003e\n    Run all rollbacks until the specified tag on the database.\n\n  convert \u003cfile\u003e\n    Convert a Liquibase changelog table to a Rove changelog table.\n\n  status\n    Output the list of changesets already applied to the database.\n```\n\n#### Database Connection Variables\n\nYou can either use the database flags or you can set the environment variables below to connect to the database. You can also prefix the environment variables using the `--envprefix` flag.\n\n```\nDB_USERNAME - database username\nDB_PASSWORD - database password\nDB_HOSTNAME - IP or hostname of the database\nDB_PORT - port of the database\nDB_NAME - name of the database\nDB_PARAMETER - parameters to append to the database connection string\n```\n\nA full list of MySQL parameters can be found [here](https://github.com/go-sql-driver/mysql#parameters).\n\n#### Example Commands and Output\n\nThese examples will show how to interact with Rove and what the output will look like.\n\n```bash\n# Set the environment variables to connect to the database.\nexport DB_USERNAME=root\nexport DB_PASSWORD=password\nexport DB_HOSTNAME=127.0.0.1\nexport DB_PORT=3306\nexport DB_NAME=webapi\nexport DB_PARAMETER=\"collation=utf8mb4_unicode_ci\u0026parseTime=true\"\n\n# Apply all of the changes from the SQL file to the database.\nrove all testdata/changeset.sql\n# Output:\n# Changesets applied (request: 0):\n# Applied: 1) josephspurrier:1 (success.sql) b7a8d1c3ea1cc2dc28a1de0e23628250 [tag='']\n# Applied: 2) josephspurrier:2 (success.sql) e3065c58bff00322c73eab057427f557 [tag='']\n# Applied: 3) josephspurrier:3 (success.sql) 57cc0b1c45cb72032bcaed07483d243d [tag='']\n\n# Try to apply all the changes again.\nrove all testdata/changeset.sql\n# Output:\n# Changesets applied (request: 0):\n# Already applied: 1) josephspurrier:1 (success.sql) b7a8d1c3ea1cc2dc28a1de0e23628250 [tag='']\n# Already applied: 2) josephspurrier:2 (success.sql) e3065c58bff00322c73eab057427f557 [tag='']\n# Already applied: 3) josephspurrier:3 (success.sql) 57cc0b1c45cb72032bcaed07483d243d [tag='']\n\n# Rollback all of the changes to the database.\nrove reset testdata/changeset.sql\n# Output:\n# Changesets rollback (request: 0):\n# Applied: 3) josephspurrier:3 (success.sql) 57cc0b1c45cb72032bcaed07483d243d [tag='']\n# Applied: 2) josephspurrier:2 (success.sql) e3065c58bff00322c73eab057427f557 [tag='']\n# Applied: 1) josephspurrier:1 (success.sql) b7a8d1c3ea1cc2dc28a1de0e23628250 [tag='']\n\n# Apply only 1 new change to the database.\nrove up 1 testdata/success.sql\n# Output:\n# Changesets applied (request: 1):\n# Applied: 1) josephspurrier:1 (success.sql) b7a8d1c3ea1cc2dc28a1de0e23628250 [tag='']\n\n# Apply 1 more change to the database.\nrove up 1 testdata/changeset.sql\n# Output:\n# Changesets applied (request: 1):\n# Already applied: 1) josephspurrier:1 (success.sql) b7a8d1c3ea1cc2dc28a1de0e23628250 [tag='']\n# Applied: 2) josephspurrier:2 (success.sql) e3065c58bff00322c73eab057427f557 [tag='']\n\n# Rollback only 1 change to the database.\nrove down 1 testdata/changeset.sql\n# Output:\n# Changesets rollback (request: 1):\n# Applied: 2) josephspurrier:2 (success.sql) e3065c58bff00322c73eab057427f557 [tag='']\n\n# Show a list of migrations already applied to the database.\nrove status\n# Output:\n# Changesets applied:\n# 1) josephspurrier:1 (success.sql) b7a8d1c3ea1cc2dc28a1de0e23628250 [tag='']\n```\n\n### Rove via Package Import\n\nBelow is an example of how to include Rove in your own Go applications.\n\n```go\nvar changesets = `\n--changeset josephspurrier:1\nCREATE TABLE user_status (\n    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,\n    \n    status VARCHAR(25) NOT NULL,\n    \n    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    deleted_at TIMESTAMP NULL DEFAULT NULL,\n    \n    PRIMARY KEY (id)\n);\n--rollback DROP TABLE user_status;\n\n--changeset josephspurrier:2\nINSERT INTO user_status (id, status, created_at, updated_at, deleted) VALUES\n(1, 'active',   CURRENT_TIMESTAMP,  CURRENT_TIMESTAMP,  0),\n(2, 'inactive', CURRENT_TIMESTAMP,  CURRENT_TIMESTAMP,  0);\n--rollback TRUNCATE TABLE user_status;`\n\n// Create a new MySQL database object.\ndb, err := mysql.New(\u0026mysql.Connection{\n  Hostname:  \"127.0.0.1\",\n  Username:  \"root\",\n  Password:  \"password\",\n  Name:      \"main\",\n  Port:      3306,\n  Parameter: \"collation=utf8mb4_unicode_ci\u0026parseTime=true\",\n})\nif err != nil {\n  log.Fatalln(err)\n}\n\n// Perform all migrations against the database.\nr := rove.NewChangesetMigration(db, changesets)\nr.Verbose = true\nerr = r.Migrate(0)\n```\n\n## Adapters\n\nRove is designed to be extensible via adapters. There is one adapter included in the package:\n\n* mysql\n\nYou may also create your own adapters - see the `interface.go` file for interfaces your adapters must satisfy.\n\n### Best Practices\n\nWhen creating an adapter, will need:\n\n- Struct that satisfies the `rove.Changelog` interface.\n- Struct that satisfies the `rove.Transaction` interface.\n- Table or data structure to use as the `changelog` to persistently track the changes made by the Rove.\n\nYou should store the following fields (at a minimum) in your changelog. This will ensure your adapter can utilize all of the features of Rove.\n\n- id\n- author\n- filename\n- dateexecuted\n- orderexecuted\n- checksum\n- description\n- tag\n- version\n\n### Example Changelog\n\nYour changelog should contain the same fields as this table:\n\n| id  | author         | filename    | dateexecuted        | orderexecuted | checksum  | description                   | tag  | version |\n| --- | -------------- | ----------- | ------------------- | ------------- | --------- | ----------------------------- | ---- | ------- |\n| 1   | josephspurrier | success.sql | 2019-01-12 16:04:16 | 1             | f0685b... | Create the user_status table. | NULL | 1.0     |\n| 2   | josephspurrier | success.sql | 2019-01-12 16:04:16 | 2             | 3f81b0... |                               | NULL | 1.0     |\n| 3   | josephspurrier | success.sql | 2019-01-12 16:04:16 | 3             | 57cc0b... |                               | NULL | 1.0     |\n\n## Migration File Specifications\n\nThere are a few components of a changeset:\n\n- Header: must be prefixed by \"--changeset \" and must follow this format: `author:id` (single line, required)\n- Body: valid sql text (multi-line, required)\n- Description: must be prefixed by \"--description \" (multi-line, optional)\n- Rollback: must be prefixed \"--rollback \"  (multi-line, optional)\n- Include: must be prefixed by \"--include \" and must follow this format: `relativefilename.sql` (single line, optional)\n- Comments: any other line that starts with \"--\" (multi-line, optional)\n\nBlank lines are ignored by Rove. The prefixes above are strict so you cannot change the case or add spacing. For instance, you cannot add a space after the dashes: `-- changeset`.\n\nExample migration file:\n\n```sql\n--changeset josephspurrier:1\n--description Create the user status table.\n--description Set deleted_at as a timestamp.\nCREATE TABLE user_status (\n    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,\n    \n    status VARCHAR(25) NOT NULL,\n    \n    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    deleted_at TIMESTAMP NULL DEFAULT NULL,\n    \n    PRIMARY KEY (id)\n);\n--rollback DROP TABLE user_status;\n\n--include anotherfile.sql\n\n--changeset josephspurrier:2\nINSERT INTO user_status (id, status, created_at, updated_at, deleted) VALUES\n(1, 'active',   CURRENT_TIMESTAMP,  CURRENT_TIMESTAMP,  0),\n(2, 'inactive', CURRENT_TIMESTAMP,  CURRENT_TIMESTAMP,  0);\n--rollback TRUNCATE TABLE user_status;\n```\n\n### Header\n\nThe header is the unique identifier for the changeset. A changeset is unique is all of these fields don't match another changeset: id, author, and filename. You can have a changeset with the same id and author in two different files.\n\n### Body\n\nThe body must be valid single or multi-line SQL queries. You can separate queries by semi-colons, but you must also pass in this parameter to the database connection: `multiStatements=true`. The checksum is based on an MD5 of this value. Any changes once the query has been applied to a database will throw an error message.\n\n### Description\n\nThe description provides information about the changeset. It will be added as a value in the changelog table.\n\n### Rollback\n\nThe rollback should be SQL which reverts the changes made by the changeset.\n\n### Include\n\nThe include allows you to reference other changeset files to load. The filename should be a relative path.\n\n### Comments\n\nAny comments at the beginning of the lines are ignored. They do not count towards the checksum.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosephspurrier%2Frove","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjosephspurrier%2Frove","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosephspurrier%2Frove/lists"}