sync-db
Command line utility to synchronize and version control relational database objects across databases.
Installation
Using npm:
$ npm install @leapfrogtechnology/sync-db
You can install it globally as well.
$ npm install -g @leapfrogtechnology/sync-db
Drivers Installation
You'll need to install the database driver specific to your project separately.
For instance - if your project uses MSSQL, you will need to do:
$ yarn add mssql
This utility uses Knex under the hood so these are the supported drivers.
Usage
You can use sync-db
both as a CLI utility and programmatically.
CLI
When installed globally, you can invoke the CLI directly.
The CLI exposes a single command sync-db
that runs synchronize operation based on your configuration.
CLI Options
Below shown are the available CLI options , which is also the output printed by sync-db --help
.
Synchronize database
USAGE
$ sync-db
OPTIONS
-f, --force Force synchronization
-h, --help Print help information
-v, --version Print version
Refer to the examples section below for full example with CLI usage.
Programmatic Usage
You may use programmatic API as shown below in case you need better flexibility based on your needs.
import { synchronize, loadConfig, resolveConnections } from '@leapfrogtechnology/sync-db';
(async () => {
const config = await loadConfig();
const connections = await resolveConnections();
await synchronize(config, connections);
})();
You can also pass your own database connection (eg: Knex connection) instead of resolving connections.sync-db.json
file.
import * as Knex from 'knex';
import { synchronize, loadConfig } from '@leapfrogtechnology/sync-db';
(async () => {
const config = await loadConfig();
const connection = Knex({
client: 'mssql',
connection: {
host: 'host',
user: 'userName',
password: 'password',
database: 'dbName'
}
});
const options = { force: false };
await synchronize(config, connection, options);
})();
Configuration
- Sync Configuration
- Database Connections
1. Sync Configuration
sync-db expects the configuration file sync-db.yml
to be present in your working directory. This holds all your configurations.
sync-db.yml
basePath: /path/to/sql
sql:
- schema/<schema_name>.sql
- function/<schema_name>/<function_name>.sql
- procedure/<schema_name>/<procedure_name>.sql
Configuration Options
basePath
(string)
- Base directory to hold all your SQL source files (default: "src/sql").sql
(array)
- A series of SQL file paths that are to be run in ordered sequence (top to bottom), based on dependency. It should be noted that the source files needs to follow this convention of directory hierarchy.
File paths listed here are relative to basePath
value.
2. Database Connections
Database connections are configured in connections-sync-db.json
file in your project root directory as shown below.
Since it contains all your database credentails, it is recommended that you DO NOT COMMIT it to VCS.
connections-sync-db.json
{
"connections": [
{
"id": "db1",
"host": "localhost",
"port": 1433,
"user": "db1user",
"database": "db1",
"password": "password",
"client": "mssql"
}
]
}
Note: The connections
key expects an array, so you can also provide multiple databases and sync-db
ensures your configured db objects are synced across all these databases.
Caveat
Setup and Teardown steps aren't always run within a single transaction. You need to pass the transaction instance object explicitly to make sure this happens.
await db.transaction(async trx => {
await synchronize(config, trx);
});
Examples
- Node MSSQL Sample (JavaScript)
Changelog
Check the CHANGELOG for release history.
Contributing
Feel free to send pull requests.
License
Licensed under The MIT License.