我有一个Express.js Web应用程序,它使用Knex.js作为SQL查询构建器和迁移引擎。 虽然Knex.js具有创建,删除和更改表的方法,但它没有创建/删除数据库本身的方法。
我想知道Knex.js是否有扩展,甚至是允许您创建/删除数据库的gulp任务。我找不到任何东西。 我正在使用PostgreSQL数据库。
答案 0 :(得分:22)
我不确定PostgreSQL,但我遇到了与MySQL相同的问题。我发现你可以在不选择数据库的情况下使用knex进行连接,使用原始SQL创建数据库,然后重新连接选择新数据库。
以下是一个独立脚本,它使用单列表创建新数据库:
var conn = {
host : '127.0.0.1',
user : 'user',
password : 'pass',
charset : 'utf8'
};
// connect without database selected
var knex = require('knex')({ client: 'mysql', connection: conn});
knex.raw('CREATE DATABASE my_database')
.then(function(){
knex.destroy();
// connect with database selected
conn.database = 'my_database';
knex = require('knex')({ client: 'mysql', connection: conn});
knex.schema.createTable('my_table', function (table) {
table.string('my_field');
})
.then(function() {
knex.destroy();
});
});
这有效(对我来说已经足够了)但我很想知道其他解决方案。
答案 1 :(得分:4)
var knex = require('knex')({
client: 'pg',
connection: {
host: HOST,
user: USERNAME,
password: PASSWORD,
database: 'postgres',
charset: 'utf8'
}
});
knex.raw('CREATE DATABASE DB_NAME;')
.then(function() {
return knex.raw('DROP DATABASE DB_NAME;')
})
.finally(function () {
console.log("Done");
});
答案 2 :(得分:2)
您可以添加https://www.npmjs.org/package/gulp-shell
这应该有效:
var gulp = require('gulp')
var shell = require('gulp-shell')
gulp.task('example', function () {
return gulp.src('*.js', {read: false})
.pipe(shell([
'psql DROP DATABASE dbname;',
'psql CREATE DATABASE dbname;'
], {
templateData: {
f: function (s) {
return s.replace(/$/, '.bak')
}
}
}))
})
答案 3 :(得分:0)
Postgres将接受应用程序的连接字符串以创建应用程序数据库。
DATABASE_URL=postgres://user:password@localhost:5432/sample_development
"scripts": {
"db:create:development": "env-cmd env/development psql ${DATABASE_URL} -c 'CREATE DATABASE sample_test'",
"db:create:test": "env-cmd env/test psql ${DATABASE_URL} -c 'CREATE DATABASE sample_test'"
}
然后运行npm run-script db:create:development
。
(这使用env-cmd
包,但这不是必需的。)
答案 4 :(得分:0)
松散相关(不是 Gulp 问题),但这是我在 Knex 应用程序中创建数据库的解决方案。我只是忽略错误,而不是与 knexfile
或 seed
集成,所以不会经常被调用,而是从 package.json
调用它。 dropdb
和 createdb
可执行文件随 Postgres 提供:
// $ yarn node ./lib/createdb.mjs
import { exec } from 'child_process';
if (process.env.NODE_ENV === 'development') {
exec(`createdb ${dbName} --template=template0`, (error, stdout, stderr) => {
if (!error) return console.log(`"${dbName}" database created!`);
return console.error('createdb stderr:', stderr);
});
}
答案 5 :(得分:0)
knex-db-manager 是一个可以做到这一点的插件包。