不要怂,就是干,撸起袖子干!

Commit a7fa3161 by Wei-Liang Liou Committed by Sushant

feat(query-interface): createDatabase / dropDatabase support (#10027)

1 parent cf6c05e0
......@@ -15,6 +15,35 @@ const throwMethodUndefined = function(methodName) {
};
class MSSQLQueryGenerator extends AbstractQueryGenerator {
createDatabaseQuery(databaseName, options) {
options = _.extend({
collate: null
}, options || {});
const query = [
'IF NOT EXISTS (SELECT * FROM sys.databases WHERE name =', wrapSingleQuote(databaseName), ')',
'BEGIN',
'CREATE DATABASE', this.quoteIdentifier(databaseName),
'<%= collation %>;',
'END;'
].join(' ');
const values = {
collation: options.collate ? 'COLLATE ' + this.escape(options.collate) : ''
};
return _.template(query, this._templateSettings)(values).trim();
}
dropDatabaseQuery(databaseName) {
return [
'IF EXISTS (SELECT * FROM sys.databases WHERE name =', wrapSingleQuote(databaseName), ')',
'BEGIN',
'DROP DATABASE', this.quoteIdentifier(databaseName), ';',
'END;'
].join(' ');
}
createSchema(schema) {
return [
'IF NOT EXISTS (SELECT schema_name',
......
......@@ -16,6 +16,33 @@ class MySQLQueryGenerator extends AbstractQueryGenerator {
});
}
createDatabaseQuery(databaseName, options) {
options = _.extend({
charset: null,
collate: null
}, options || {});
const query = 'CREATE DATABASE IF NOT EXISTS <%= database %><%= charset %><%= collation %>';
const values = {
database: this.quoteIdentifier(databaseName),
charset: options.charset ? ' DEFAULT CHARSET SET = ' + this.escape(options.charset) : '',
collation: options.collate ? ' DEFAULT COLLATE = ' + this.escape(options.collate) : ''
};
return _.template(query, this._templateSettings)(values).trim() + ';';
}
dropDatabaseQuery(databaseName) {
const query = 'DROP DATABASE IF EXISTS <%= database %>';
const values = {
database: this.quoteIdentifier(databaseName)
};
return _.template(query, this._templateSettings)(values).trim() + ';';
}
createSchema() {
return 'SHOW TABLES';
}
......
......@@ -12,6 +12,25 @@ class PostgresQueryGenerator extends AbstractQueryGenerator {
return `SET search_path to ${searchPath};`;
}
createDatabaseQuery(databaseName, options) {
options = _.extend({
encoding: null,
collate: null
}, options || {});
const values = {
database: this.quoteTable(databaseName),
encoding: options.encoding ? ' ENCODING = ' + this.escape(options.encoding) : '',
collation: options.collate ? ' LC_COLLATE = ' + this.escape(options.collate) : ''
};
return `CREATE DATABASE IF NOT EXISTS ${values.database}${values.encoding}${values.collation};`;
}
dropDatabaseQuery(databaseName) {
return `DROP DATABASE IF EXISTS ${this.quoteTable(databaseName)} CASCADE;`;
}
createSchema(schema) {
const databaseVersion = _.get(this, 'sequelize.options.databaseVersion', 0);
......
......@@ -25,6 +25,37 @@ class QueryInterface {
}
/**
* Creates a database
*
* @param {string} schema Schema name to create
* @param {Object} [options] Query options
* @param {string} [options.charset] Database default character set, MYSQL only
* @param {string} [options.encoding] Database default character set, PostgreSQL only
* @param {string} [options.collate] Database default collation
*
* @returns {Promise}
*/
createDatabase(schema, options) {
options = options || {};
const sql = this.QueryGenerator.createDatabaseQuery(schema, options);
return this.sequelize.query(sql, options);
}
/**
* Drops a database
*
* @param {string} schema Schema name to drop
* @param {Object} [options] Query options
*
* @returns {Promise}
*/
dropDatabase(schema, options) {
options = options || {};
const sql = this.QueryGenerator.dropDatabaseQuery(schema);
return this.sequelize.query(sql, options);
}
/**
* Creates a schema
*
* @param {string} schema Schema name to create
......
......@@ -15,6 +15,24 @@ if (current.dialect.name === 'mssql') {
});
});
it('createDatabaseQuery', function() {
expectsql(this.queryGenerator.createDatabaseQuery('myDatabase'), {
mssql: "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'myDatabase' ) BEGIN CREATE DATABASE [myDatabase] ; END;"
});
});
it('createDatabaseQuery with collate', function() {
expectsql(this.queryGenerator.createDatabaseQuery('myDatabase', {collate: 'Latin1_General_CS_AS_KS_WS'}), {
mssql: "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'myDatabase' ) BEGIN CREATE DATABASE [myDatabase] COLLATE N'Latin1_General_CS_AS_KS_WS'; END;"
});
});
it('dropDatabaseQuery', function() {
expectsql(this.queryGenerator.dropDatabaseQuery('myDatabase'), {
mssql: "IF EXISTS (SELECT * FROM sys.databases WHERE name = 'myDatabase' ) BEGIN DROP DATABASE [myDatabase] ; END;"
});
});
it('createTableQuery', function() {
expectsql(this.queryGenerator.createTableQuery('myTable', { int: 'INTEGER' }, {}), {
mssql: "IF OBJECT_ID('[myTable]', 'U') IS NULL CREATE TABLE [myTable] ([int] INTEGER);"
......
......@@ -11,6 +11,30 @@ const chai = require('chai'),
if (dialect === 'mysql') {
describe('[MYSQL Specific] QueryGenerator', () => {
const suites = {
createDatabaseQuery: [
{
arguments: ['myDatabase'],
expectation: 'CREATE DATABASE IF NOT EXISTS `myDatabase`;'
},
{
arguments: ['myDatabase', {charset: 'utf8mb4'}],
expectation: 'CREATE DATABASE IF NOT EXISTS `myDatabase` DEFAULT CHARSET SET = \'utf8mb4\';'
},
{
arguments: ['myDatabase', {collate: 'utf8mb4_unicode_ci'}],
expectation: 'CREATE DATABASE IF NOT EXISTS `myDatabase` DEFAULT COLLATE = \'utf8mb4_unicode_ci\';'
},
{
arguments: ['myDatabase', {charset: 'utf8mb4', collate: 'utf8mb4_unicode_ci'}],
expectation: 'CREATE DATABASE IF NOT EXISTS `myDatabase` DEFAULT CHARSET SET = \'utf8mb4\' DEFAULT COLLATE = \'utf8mb4_unicode_ci\';'
}
],
dropDatabaseQuery: [
{
arguments: ['myDatabase'],
expectation: 'DROP DATABASE IF EXISTS `myDatabase`;'
}
],
arithmeticQuery: [
{
title: 'Should use the plus operator',
......
......@@ -14,6 +14,30 @@ const chai = require('chai'),
if (dialect.match(/^postgres/)) {
describe('[POSTGRES Specific] QueryGenerator', () => {
const suites = {
createDatabaseQuery: [
{
arguments: ['myDatabase'],
expectation: 'CREATE DATABASE IF NOT EXISTS "myDatabase";'
},
{
arguments: ['myDatabase', {encoding: 'UTF8'}],
expectation: 'CREATE DATABASE IF NOT EXISTS "myDatabase" ENCODING = \'UTF8\';'
},
{
arguments: ['myDatabase', {collate: 'en_US.UTF-8'}],
expectation: 'CREATE DATABASE IF NOT EXISTS "myDatabase" LC_COLLATE = \'en_US.UTF-8\';'
},
{
arguments: ['myDatabase', {encoding: 'UTF8', collate: 'en_US.UTF-8'}],
expectation: 'CREATE DATABASE IF NOT EXISTS "myDatabase" ENCODING = \'UTF8\' LC_COLLATE = \'en_US.UTF-8\';'
}
],
dropDatabaseQuery: [
{
arguments: ['myDatabase'],
expectation: 'DROP DATABASE IF EXISTS "myDatabase" CASCADE;'
}
],
arithmeticQuery: [
{
title: 'Should use the plus operator',
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!