• Stars
    star
    127
  • Rank 282,790 (Top 6 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 9 years ago
  • Updated about 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Compares two postgresql or mysql databases and prints SQL commands to modify the first one in order to match the second one

dbdiff

Compares two databases and prints SQL commands to modify the first one in order to match the second one.

It does NOT execute the statements. It only prints the statements.

It supports PostgreSQL and MySQL.

Installing

Install globally with npm

npm install dbdiff -g

CLI Usage

dbdiff \
  -l safe
  dialect://user:pass@host[:port]/dbname1 \
  dialect://user:pass@host[:port]/dbname2

Where dialect can be either postgres or mysql. The first database url denotes the target, the second the source, the sql queries will allow target to be updated to source state.

The flag -l or --level indicates the safety of the SQL. Allowed values are safe, warn and drop

Safety level

Some statements may fail or may produce data loss depending on the data stored in the target database.

  • When the safe level is specified, only SQL statements that are guaranteed to preserve existing data will be printed. Any other command will be commented out.
  • When the warn level is specified also SQL statements that may fail because of existing data will be printed. These commands are for example: changes in data types or dropping a NOT NULL constraint.
  • When the drop level is specified all SQL statements are printed and this may contain DROP COLUMN or DROP TABLE statements.

Dropping a sequence or dropping an index is considered safe.

Changing the data type of existing columns

Sometimes Postgresql won't be able to change the existing data to the new data type. In that case you will get an error similar to this:

ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

You can manually specify a USING expression to perform de conversion. For example to convert text to integers:

ALTER TABLE table_name
  ALTER column_name TYPE data_type USING column_name::integer

Usage as a library

You can use dbdiff as a library:

var dbdiff = require('dbdiff')

dbdiff.describeDatabase(connString)
  .then((schema) => {
    // schema is a JSON-serializable object representing the database structure
  })

var diff = new dbdiff.DbDiff()
// Compare two databases passing the connection strings
diff.compare(conn1, conn2)
  .then(() => {
    console.log(diff.commands('drop'))
  })

// Compare two schemas
diff.compareSchemas(schema1, schema2)
console.log(diff.commands('drop'))

You can pass connection strings such as postgres://user:pass@host:5432/dbname1 or objects to these methods. For example:

dbdiff.describeDatabase({
  dialect: 'postgres', // use `mysql` for mysql
  username: 'user',
  password: 'pass',
  database: 'dbname1',
  host: 'localhost',
  dialectOptions: {
    ssl: false
  }
})
.then((schema) => {
  // ...
})

Example of .describeDatabase() output

{
  "tables": [
    {
      "name": "users",
      "schema": "public",
      "indexes": [],
      "constraints": [
        {
          "name": "email_unique",
          "schema": "public",
          "type": "unique",
          "columns": [
            "email"
          ]
        },
        {
          "name": "users_pk",
          "schema": "public",
          "type": "primary",
          "columns": [
            "id"
          ]
        }
      ],
      "columns": [
        {
          "name": "id",
          "nullable": false,
          "default_value": "nextval('users_id_seq'::regclass)",
          "type": "integer"
        },
        {
          "name": "email",
          "nullable": true,
          "default_value": null,
          "type": "character varying(255)"
        }
      ]
    },
    {
      "name": "items",
      "schema": "public",
      "indexes": [],
      "constraints": [
        {
          "name": "items_fk",
          "schema": "public",
          "type": "foreign",
          "columns": [
            "user_id"
          ],
          "referenced_table": "users",
          "referenced_columns": [
            "id"
          ]
        }
      ],
      "columns": [
        {
          "name": "id",
          "nullable": false,
          "default_value": "nextval('items_id_seq'::regclass)",
          "type": "integer"
        },
        {
          "name": "name",
          "nullable": true,
          "default_value": null,
          "type": "character varying(255)"
        },
        {
          "name": "user_id",
          "nullable": true,
          "default_value": null,
          "type": "bigint"
        }
      ]
    }
  ],
  "sequences": [
    {
      "data_type": "bigint",
      "numeric_precision": 64,
      "numeric_precision_radix": 2,
      "numeric_scale": 0,
      "start_value": "1",
      "minimum_value": "1",
      "maximum_value": "9223372036854775807",
      "increment": "1",
      "schema": "public",
      "name": "users_id_seq",
      "cycle": false
    },
    {
      "data_type": "bigint",
      "numeric_precision": 64,
      "numeric_precision_radix": 2,
      "numeric_scale": 0,
      "start_value": "1",
      "minimum_value": "1",
      "maximum_value": "9223372036854775807",
      "increment": "1",
      "schema": "public",
      "name": "items_id_seq",
      "cycle": false
    }
  ]
}

More Repositories

1

iOS-boilerplate

iOS-app template with lots of common tasks solved
Objective-C
2,766
star
2

eslint-action

GitHub action that lints your code with eslint in parallel to your builds
JavaScript
127
star
3

rubocop-action

Lint your Ruby code in parallel to your builds
Ruby
75
star
4

unicycle

Unicycle is an Electron application built using TypeScript, React and ant.design. Its purpose is to unify the design / development cycle.
TypeScript
69
star
5

ui-state-sync

DIY modern JavaScript framework based on Virtual DOM
JavaScript
67
star
6

devtoolbelt

Handy micro-tools for developers
JavaScript
35
star
7

github-jest-snapshots

See Jest Snapshots in your commits
JavaScript
33
star
8

sequelize-sync-diff

Uses Sequelize.sync() but generates ALTER statements instead of DROP+CREATE
JavaScript
24
star
9

github-linker

VSCode extension to create permanent links to pieces of code
TypeScript
23
star
10

type-writer

Generate type definitions for TypeScript, Flow, PropTypes, etc. by using examples of the data
JavaScript
18
star
11

git-scripts

My personal git scripts
Shell
12
star
12

actions

GitHub actions!
JavaScript
11
star
13

helical

Helical is a general purpose code generator. It takes a data model definition and a set of templates (called generators) and generates an output.
JavaScript
6
star
14

pync

Utilities for promises pync ~= promise + async
JavaScript
5
star
15

tot

Experimental language, superset of JavaScript, for writing async code like sync code
JavaScript
4
star
16

txain

A simple module for async control flow
JavaScript
4
star
17

mocktokit

A Mock GitHub API for testing integrations.
JavaScript
4
star
18

github-lab

Place where I test APIs and other GitHub stuff
JavaScript
4
star
19

emmental

Template engine for Nodejs
JavaScript
4
star
20

fraggle

A command line utility to deploy different versions of nodejs applications
JavaScript
4
star
21

awaitNewYear

Example repo for using async/await in nodejs in 2016
JavaScript
3
star
22

tallernodejs

CΓ³digo de los ejercicios del taller de nodejs de Cachirulo Valley. Julio 2011
JavaScript
3
star
23

hack-require

Hack require() for fun and profit
JavaScript
2
star
24

lionfish.app

Repository to talk about lionfish.app or report issues.
2
star
25

seaquel

The best of an ORM with the flexibility of writing your own SQL
JavaScript
2
star
26

dione

Instrumentalizes JavaScript code to send tracing information via WebSockets
JavaScript
2
star
27

clack

Command line Slack client
JavaScript
2
star
28

phlow

Get to work as quick as possible
JavaScript
2
star
29

graphqlize

Expose GraphQL services from Plain JavaScript Classes
JavaScript
2
star
30

images

A common Java API to manipulate images inside and outside Google App Engine
2
star
31

pgprom

Easiest and safest way to use postgres abusing template strings
JavaScript
2
star
32

create-typescript-library

A script to use alexjoverm/typescript-library-starter in a single command with optimization rules
JavaScript
2
star
33

identicons

Generate SVG identicons in node and the browser
JavaScript
2
star
34

barna

A tiny library to send debugging information to Slack
JavaScript
1
star
35

gimenete.github.io

Homepage
HTML
1
star
36

jade-interactive

Feel like Neo when coding jade templates
JavaScript
1
star
37

yubikey-invalidation-action

GitHub Action that invalidates Yubikeys found in issues or issue comments
JavaScript
1
star
38

dakota

Atom package that transforms pieces of JavaScript code
JavaScript
1
star
39

authentication-service-example

HTML
1
star
40

probot-report-error

Something failed in your probot bot? No problem, probot-lifeguard will open a helpful issue
JavaScript
1
star
41

iclever

Links to the tools you need. http://i.clevertech.biz
1
star
42

congresoabierto

C#
1
star
43

helical-express-sequelize-jade

A helical generator to create a structure of a Node application using express, sequelize and jade.
JavaScript
1
star
44

gdg-marbella

JavaScript
1
star