db-migrate 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +6 -2
- data/bin/migrate +2 -1
- data/db-migrate.gemspec +1 -1
- data/lib/migrate/migrator.rb +38 -6
- data/lib/migrate/storage/db.rb +29 -8
- data/lib/migrate/storage/mysql.rb +7 -0
- data/lib/migrate/storage/postgres.rb +21 -0
- data/spec/lib/storage/db_spec.rb +7 -2
- data/spec/spec_helper.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c9d9e26ef60000e8df08e69c64785f48916b3cf
|
4
|
+
data.tar.gz: d0ee951a80e3c977887261eeaa309893b6613e7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff194194be430978206223312659d01aec0d1f0e9edac2936e56119992f4cb49bab9c82e016c2979610f71bdf215196748d0cd418174c5388ec0b2153264550d
|
7
|
+
data.tar.gz: 717dfe6e6efa4f7f8c604447b4cd585bd37d4351de73efef85a96f232aa194f81e9e169883240022a71f116eddea57f15e95dd8c9102b909946bf9e276cf952e
|
data/.travis.yml
CHANGED
@@ -7,6 +7,9 @@ rvm:
|
|
7
7
|
|
8
8
|
script: "bundle exec rspec"
|
9
9
|
|
10
|
+
addons:
|
11
|
+
postgresql: "9.4"
|
12
|
+
|
10
13
|
services:
|
11
14
|
- mysql
|
12
15
|
- postgresql
|
@@ -14,3 +17,5 @@ services:
|
|
14
17
|
before_script:
|
15
18
|
- mysql -e 'create database migrate_test;'
|
16
19
|
- psql -c 'create database migrate_test;' -U postgres
|
20
|
+
- psql -c 'CREATE SCHEMA IF NOT EXISTS public;' -U postgres
|
21
|
+
- psql -c 'SET search_path = public;' -U postgres
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -9,6 +9,8 @@ Tool for managing and executing your database migrations.
|
|
9
9
|
gem install db-migrate
|
10
10
|
```
|
11
11
|
|
12
|
+
If you are going to use for example Postgres with **migrate**, make sure that you have Postgresql server running.
|
13
|
+
|
12
14
|
## Demo
|
13
15
|

|
14
16
|
|
@@ -36,7 +38,7 @@ It supports multiple databases and multiple languages for executing migrations.
|
|
36
38
|
##### --help
|
37
39
|
```
|
38
40
|
Commands:
|
39
|
-
migrate init #
|
41
|
+
migrate init # initialize tables and create config file if necessary
|
40
42
|
migrate new [DESCRIPTION] # generate files for new migration
|
41
43
|
migrate up # Upgrade database schema
|
42
44
|
migrate down # Downgrade database schema
|
@@ -81,7 +83,9 @@ version_number=version_number_table_name
|
|
81
83
|
If configuration file does not exist, it will run interactive configuration file creation process. You will answer few questions about your database, and **migrate** will create configuration file for you.
|
82
84
|
|
83
85
|
#### new
|
84
|
-
After that you can start generating migrations by using **migrate new** command. This will generate migration
|
86
|
+
After that you can start generating migrations by using **migrate new** command. This will generate migration scripts for you based on your prefered language.
|
87
|
+
|
88
|
+
You will get new directory in format `vXXX-YYYY`, where `XXX` is version number, and `YYY` is short description you provide. Inside generated directory there will be two files. `up.LANG` and `down.LANG`, where `LANG` is language you use for writing migration scripts.
|
85
89
|
|
86
90
|
#### up
|
87
91
|
When you are done with writing your `up` and `down` migration script, you can execute **migrate up** to run up migration script for new version. You can also execute multiple migrations in single call by providing `--to n` argument, where `n` is highest version where you want to navigate.
|
data/bin/migrate
CHANGED
@@ -114,6 +114,7 @@ class CLI < Thor
|
|
114
114
|
end
|
115
115
|
|
116
116
|
@migrator.init
|
117
|
+
@migrator.recover
|
117
118
|
rescue Exception => e
|
118
119
|
Log.error("Error while initialization.", e)
|
119
120
|
if generated_config
|
@@ -123,7 +124,7 @@ class CLI < Thor
|
|
123
124
|
end
|
124
125
|
|
125
126
|
desc "new [DESCRIPTION]", "generate files for new migration"
|
126
|
-
def new(description="")
|
127
|
+
def new(description="migration")
|
127
128
|
@migrator.new(description)
|
128
129
|
end
|
129
130
|
|
data/db-migrate.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'db-migrate'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.2.0'
|
4
4
|
s.licenses = ['MIT']
|
5
5
|
s.summary = "Tool for managing and executing your database migrations."
|
6
6
|
s.description = "#{s.summary} It supports multiple databases and multiple languages for writing migration scripts."
|
data/lib/migrate/migrator.rb
CHANGED
@@ -17,23 +17,55 @@ module Migrate
|
|
17
17
|
|
18
18
|
def init
|
19
19
|
@db.tx do
|
20
|
-
@db.
|
20
|
+
if @db.tables_exists?
|
21
|
+
Log.info("Version tables already exist.")
|
22
|
+
else
|
23
|
+
@db.create_tables
|
24
|
+
end
|
25
|
+
|
26
|
+
self.recover
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
30
|
+
def recover
|
31
|
+
@db.tx do
|
32
|
+
directory = @config.root
|
33
|
+
migrations = Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
|
34
|
+
migrations.each do |migration|
|
35
|
+
match = migration.match(/v(\d*)-(.*)/i)
|
36
|
+
if match != nil
|
37
|
+
v, desc = match.captures
|
38
|
+
unless @db.version_exists?(v)
|
39
|
+
self.new(desc, v)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
24
47
|
def migration_dir(migration)
|
25
48
|
date = DateTime.parse(migration["created_date"].to_s)
|
26
|
-
"#{@config.root}/v#{migration["version"]}-#{
|
49
|
+
"#{@config.root}/v#{migration["version"]}-#{migration["description"]}"
|
27
50
|
end
|
28
51
|
|
29
|
-
def new(desc)
|
52
|
+
def new(desc, version=nil)
|
30
53
|
@db.tx do
|
31
54
|
Log.info("Creating new migration...")
|
32
55
|
|
33
|
-
|
56
|
+
if version == nil
|
57
|
+
version = @db.highest_version.to_i + 1
|
58
|
+
end
|
59
|
+
|
60
|
+
migration = @db.new_migration(version, desc)
|
34
61
|
migration_dir = self.migration_dir(migration)
|
35
|
-
|
36
|
-
|
62
|
+
|
63
|
+
if Dir.exists? migration_dir
|
64
|
+
Log.info("Migration directory '#{migration_dir}' already exists.")
|
65
|
+
else
|
66
|
+
Dir.mkdir migration_dir
|
67
|
+
@lang.create_migration(migration_dir)
|
68
|
+
end
|
37
69
|
|
38
70
|
Log.success("Migration for version #{migration["version"]} created.")
|
39
71
|
migration_dir
|
data/lib/migrate/storage/db.rb
CHANGED
@@ -13,10 +13,10 @@ module Migrate
|
|
13
13
|
@config.storage
|
14
14
|
end
|
15
15
|
|
16
|
-
def new_migration(description="")
|
16
|
+
def new_migration(version=0, description="")
|
17
17
|
self.exec_sql <<-eos
|
18
|
-
INSERT INTO #{@config.version_info} (description, created_date)
|
19
|
-
VALUES('#{description}', now())
|
18
|
+
INSERT INTO #{@config.version_info} (version, description, created_date)
|
19
|
+
VALUES(#{version}, '#{description}', now())
|
20
20
|
eos
|
21
21
|
|
22
22
|
res = self.exec_sql <<-eos
|
@@ -26,7 +26,7 @@ module Migrate
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def list_migrations(selects, limit)
|
29
|
-
self.exec_sql <<-eos
|
29
|
+
self.exec_sql <<-eos
|
30
30
|
SELECT #{(selects == nil ? "*" : selects)} FROM #{@config.version_info}
|
31
31
|
ORDER BY last_up, version
|
32
32
|
#{limit != nil ? "LIMIT #{limit}" : ""}
|
@@ -57,9 +57,19 @@ module Migrate
|
|
57
57
|
eos
|
58
58
|
end
|
59
59
|
|
60
|
+
def highest_version
|
61
|
+
self.extract_version self.exec_sql <<-eos
|
62
|
+
SELECT version FROM #{@config.version_info}
|
63
|
+
ORDER BY version DESC
|
64
|
+
LIMIT 1
|
65
|
+
eos
|
66
|
+
rescue VersionNotFound => e
|
67
|
+
0
|
68
|
+
end
|
69
|
+
|
60
70
|
def next_version
|
61
71
|
self.extract_version self.exec_sql <<-eos
|
62
|
-
SELECT version FROM #{@config.version_info}
|
72
|
+
SELECT version FROM #{@config.version_info}
|
63
73
|
WHERE version > (SELECT version FROM #{@config.version_number} LIMIT 1)
|
64
74
|
ORDER BY version
|
65
75
|
LIMIT 1
|
@@ -75,8 +85,8 @@ module Migrate
|
|
75
85
|
|
76
86
|
def prev_version
|
77
87
|
self.extract_version self.exec_sql <<-eos
|
78
|
-
SELECT version FROM #{@config.version_info}
|
79
|
-
WHERE version < (SELECT version FROM #{@config.version_number} LIMIT 1)
|
88
|
+
SELECT version FROM #{@config.version_info}
|
89
|
+
WHERE version < (SELECT version FROM #{@config.version_number} LIMIT 1)
|
80
90
|
ORDER BY version DESC
|
81
91
|
LIMIT 1
|
82
92
|
eos
|
@@ -89,7 +99,7 @@ module Migrate
|
|
89
99
|
|
90
100
|
def log_down(version)
|
91
101
|
self.exec_sql "UPDATE #{@config.version_info} SET last_down=now() WHERE version=#{version}"
|
92
|
-
|
102
|
+
|
93
103
|
lowest_version = self.lowest_version
|
94
104
|
version_to_save = lowest_version.to_i < version.to_i ? self.prev_version().to_i : 0
|
95
105
|
self.exec_sql "UPDATE #{@config.version_number} SET version=#{version_to_save}"
|
@@ -104,6 +114,13 @@ module Migrate
|
|
104
114
|
end
|
105
115
|
end
|
106
116
|
|
117
|
+
def version_exists?(version)
|
118
|
+
self.get_migration(version)
|
119
|
+
true
|
120
|
+
rescue VersionNotFound
|
121
|
+
false
|
122
|
+
end
|
123
|
+
|
107
124
|
def delete(version)
|
108
125
|
self.exec_sql "DELETE FROM #{@config.version_info} WHERE version=#{version}"
|
109
126
|
end
|
@@ -136,6 +153,10 @@ module Migrate
|
|
136
153
|
raise "Implementation for creating tables not found"
|
137
154
|
end
|
138
155
|
|
156
|
+
def tables_exists?
|
157
|
+
raise "Implementation for checking if version tables already exists not found"
|
158
|
+
end
|
159
|
+
|
139
160
|
# Executes SQL
|
140
161
|
def exec_sql(sql)
|
141
162
|
raise "Implementation for executing SQL script not found"
|
@@ -40,6 +40,13 @@ module Migrate
|
|
40
40
|
Log.success("Version table created")
|
41
41
|
end
|
42
42
|
|
43
|
+
def tables_exists?
|
44
|
+
vi = self.exec_sql("SHOW TABLES LIKE '#{@config.version_info}'")
|
45
|
+
vn = self.exec_sql("SHOW TABLES LIKE '#{@config.version_number}'")
|
46
|
+
|
47
|
+
vi.length > 0 && vn.length > 0
|
48
|
+
end
|
49
|
+
|
43
50
|
def exec_sql(sql)
|
44
51
|
results = []
|
45
52
|
result = @tx.query sql
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "pg"
|
2
|
+
require 'wannabe_bool'
|
2
3
|
|
3
4
|
module Migrate
|
4
5
|
module Storage
|
@@ -13,6 +14,26 @@ module Migrate
|
|
13
14
|
})
|
14
15
|
end
|
15
16
|
|
17
|
+
def tables_exists?
|
18
|
+
vi = self.exec_sql <<-eos
|
19
|
+
SELECT EXISTS (
|
20
|
+
SELECT 1
|
21
|
+
FROM information_schema.tables
|
22
|
+
WHERE table_name = '#{@config.version_info}'
|
23
|
+
);
|
24
|
+
eos
|
25
|
+
|
26
|
+
vn = self.exec_sql <<-eos
|
27
|
+
SELECT EXISTS (
|
28
|
+
SELECT 1
|
29
|
+
FROM information_schema.tables
|
30
|
+
WHERE table_name = '#{@config.version_number}'
|
31
|
+
);
|
32
|
+
eos
|
33
|
+
|
34
|
+
vi[0]["exists"].to_b && vn[0]["exists"].to_b
|
35
|
+
end
|
36
|
+
|
16
37
|
def create_tables
|
17
38
|
Log.info("Creating version table")
|
18
39
|
self.exec_sql <<-eos
|
data/spec/lib/storage/db_spec.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
describe "Storage" do
|
2
2
|
$dbs.each do |db|
|
3
|
-
|
4
3
|
around(:each) do |test|
|
5
4
|
db.tx do
|
6
5
|
test.run
|
@@ -9,7 +8,8 @@ describe "Storage" do
|
|
9
8
|
|
10
9
|
context db.type do
|
11
10
|
it "should create new migration" do
|
12
|
-
created = db.new_migration("this is description")
|
11
|
+
created = db.new_migration(200, "this is description")
|
12
|
+
expect(created["version"].to_i).to eq(200)
|
13
13
|
expect(created).not_to eq(nil)
|
14
14
|
expect(db.exec_sql(
|
15
15
|
"SELECT * FROM #{$version_info} WHERE version=#{created["version"]}")[0])
|
@@ -53,6 +53,11 @@ describe "Storage" do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
it "should be able to check if version table already exists" do
|
57
|
+
exists = db.tables_exists?
|
58
|
+
expect(exists).to be true
|
59
|
+
end
|
60
|
+
|
56
61
|
it "should get lowest version" do
|
57
62
|
version = db.lowest_version
|
58
63
|
expect(version.to_s).to eq("1")
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db-migrate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Pusic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|