Skip to content

Commit 1deab98

Browse files
committed
feat: implement migrate cli: metasql m [version]
Refs: #30 PR-URL: #33
1 parent c8110fe commit 1deab98

File tree

5 files changed

+150
-7
lines changed

5 files changed

+150
-7
lines changed

lib/schema-db.js

+33-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class DatabaseSchema {
108108
async generate() {
109109
const { name, driver, version } = this.database;
110110
const now = new Date().toISOString().substring(0, 10);
111-
console.log(`Migration ${driver} database: ${name} v${version} (${now})`);
111+
console.log(`Generate migration: ${driver}:${name} v${version} (${now})`);
112112
const ps = await this.getPreviousSchema();
113113
if (!ps) {
114114
console.log('Previous schema is not found in ../history');
@@ -131,6 +131,32 @@ class DatabaseSchema {
131131
console.log(`Migration up: ${migUp}`);
132132
console.log(`Migration down: ${migDn}`);
133133
}
134+
135+
async migrate(version) {
136+
if (version) console.log(`Migration to this version: ${version}`);
137+
else console.log('Migration to the latest version');
138+
const migPath = path.join(this.path, `migrations`);
139+
const files = await fs.readdir(migPath, { withFileTypes: true });
140+
files.sort((a, b) => a.name < b.name ? -1 : 1);
141+
for (const file of files) {
142+
if (file.isDirectory()) continue;
143+
const { name } = file;
144+
const from = name.lastIndexOf('v') + 1;
145+
const to = name.lastIndexOf('-');
146+
const v = parseInt(name.substring(from, to), 10);
147+
if (!name.endsWith('-up.sql')) continue;
148+
if (!version || v <= version) {
149+
const fileName = path.join(migPath, name);
150+
const sql = await fs.readFile(fileName, 'utf8');
151+
console.log(`Apply script: ${name}`);
152+
await this.execute(sql);
153+
}
154+
}
155+
}
156+
157+
async execute(sql) {
158+
throw new Error(`Method is not implemented: execute(${sql})`);
159+
}
134160
}
135161

136162
DatabaseSchema.implementations = {};
@@ -145,8 +171,14 @@ const generate = async schemaPath => {
145171
await schema.generate();
146172
};
147173

174+
const migrate = async (schemaPath, version) => {
175+
const schema = await DatabaseSchema.load(schemaPath);
176+
await schema.migrate(version);
177+
};
178+
148179
module.exports = {
149180
DatabaseSchema,
150181
create,
151182
generate,
183+
migrate,
152184
};

lib/schema-pg.js

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22

3+
const { Client } = require('pg');
34
const { DatabaseSchema } = require('./schema-db.js');
45
const { toLowerCamel, toUpperCamel, isUpperCamel } = require('./utils.js');
56

@@ -109,6 +110,13 @@ class PgSchema extends DatabaseSchema {
109110
sql.push(');');
110111
return sql.join('\n') + '\n\n' + idx.join('\n');
111112
}
113+
114+
async execute(sql) {
115+
const client = new Client(this.database.connection);
116+
await client.connect();
117+
await client.query(sql);
118+
await client.end();
119+
}
112120
}
113121

114122
DatabaseSchema.implementations.pg = PgSchema;

package-lock.json

+105-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"typescript": "^4.0.2"
5353
},
5454
"dependencies": {
55-
"@metarhia/common": "^2.2.0"
55+
"@metarhia/common": "^2.2.0",
56+
"pg": "^8.3.3"
5657
}
5758
}

sql.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const { SelectBuilder } = require('./lib/select-builder.js');
55
const { RawBuilder } = require('./lib/raw-builder.js');
66
const { ParamsBuilder } = require('./lib/params-builder.js');
77
const { PostgresParamsBuilder } = require('./lib/pg-params-builder.js');
8-
const { create, generate } = require('./lib/schema-db.js');
8+
const { create, generate, migrate } = require('./lib/schema-db.js');
99
require('./lib/schema-pg.js');
1010

1111
const pg = handler => {
@@ -23,5 +23,6 @@ module.exports = {
2323
PostgresParamsBuilder,
2424
create,
2525
generate,
26+
migrate,
2627
pg,
2728
};

0 commit comments

Comments
 (0)