Allow explicit data types

Override columnDataType function

Add test cases

Apply feedback

Use date type as explicit datatype
This commit is contained in:
ssh24 2017-05-23 10:43:57 -04:00
parent fc55994d8c
commit 44083e43c1
3 changed files with 125 additions and 2 deletions

View File

@ -702,6 +702,33 @@ function mixinMigration(MySQL, mysql) {
return line; return line;
}; };
// override this function from base connector to allow mysql connector to
// accept dataPrecision and dataScale as column specific properties
MySQL.prototype.columnDataType = function(model, property) {
var columnMetadata = this.columnMetadata(model, property);
var colType = columnMetadata && columnMetadata.dataType;
if (colType) {
colType = colType.toUpperCase();
}
var prop = this.getModelDefinition(model).properties[property];
if (!prop) {
return null;
}
var colLength = columnMetadata && columnMetadata.dataLength || prop.length || prop.limit;
var colPrecision = columnMetadata && columnMetadata.dataPrecision;
var colScale = columnMetadata && columnMetadata.dataScale;
// info on setting column specific properties
// i.e dataLength, dataPrecision, dataScale
// https://loopback.io/doc/en/lb3/Model-definition-JSON-file.html
if (colType) {
if (colLength) return colType + '(' + colLength + ')';
if (colPrecision && colScale) return colType + '(' + colPrecision + ',' + colScale + ')';
if (colPrecision) return colType + '(' + colPrecision + ')';
return colType;
}
return this.buildColumnType(prop);
};
MySQL.prototype.buildColumnType = function buildColumnType(propertyDefinition) { MySQL.prototype.buildColumnType = function buildColumnType(propertyDefinition) {
var dt = ''; var dt = '';
var p = propertyDefinition; var p = propertyDefinition;
@ -743,7 +770,9 @@ function mixinMigration(MySQL, mysql) {
function columnType(p, defaultType) { function columnType(p, defaultType) {
var dt = defaultType; var dt = defaultType;
if (p.dataType) { if (p.mysql && p.mysql.dataType) {
dt = String(p.mysql.dataType);
} else if (p.dataType) {
dt = String(p.dataType); dt = String(p.dataType);
} }
return dt; return dt;

View File

@ -15,6 +15,7 @@
"dependencies": { "dependencies": {
"async": "^0.9.0", "async": "^0.9.0",
"debug": "^2.1.1", "debug": "^2.1.1",
"lodash": "^4.17.4",
"loopback-connector": "^4.0.0", "loopback-connector": "^4.0.0",
"mysql": "^2.11.1", "mysql": "^2.11.1",
"strong-globalize": "^2.5.8" "strong-globalize": "^2.5.8"

View File

@ -6,13 +6,106 @@
'use strict'; 'use strict';
require('./init.js'); require('./init.js');
var assert = require('assert'); var assert = require('assert');
var _ = require('lodash');
var db, BlobModel, EnumModel, ANIMAL_ENUM; var db, BlobModel, EnumModel, ANIMAL_ENUM, City, Account;
var mysqlVersion; var mysqlVersion;
describe('MySQL specific datatypes', function() { describe('MySQL specific datatypes', function() {
before(setup); before(setup);
describe('Support explicit datatypes on a property', function() {
var dateString1 = '2017-04-01';
var dateString2 = '2016-01-30';
var dateForTransactions = [new Date(dateString1).toString(), new Date(dateString2).toString()];
var data = [
{
type: 'Student - Basic',
amount: 1000,
lastTransaction: dateString1,
},
{
type: 'Professional',
amount: 1999.99,
lastTransaction: dateString2,
},
];
before(function(done) {
require('./init.js');
db = getSchema();
Account = db.define('Account', {
type: {type: String},
amount: {
type: Number,
mysql: {
dataType: 'DECIMAL',
dataPrecision: 10,
dataScale: 2,
},
},
lastTransaction: {
type: String,
mysql: {
dataType: 'DATE',
},
},
});
db.automigrate(done);
});
after(function(done) {
Account.destroyAll(done);
});
it('create an instance', function(done) {
Account.create(data, function(err, result) {
assert(!err);
assert(result);
assert(_.isEqual(data.length, result.length));
assert(_.isEqual(data[0].amount, result[0].amount));
assert(_.isEqual(data[1].amount, result[1].amount));
done();
});
});
it('find an instance', function(done) {
Account.find(function(err, result) {
assert(!err);
assert(result);
assert(_.isEqual(data.length, result.length));
assert(_.isEqual(data[0].amount, result[0].amount));
assert(_.isEqual(data[1].amount, result[1].amount));
assert(_.isEqual(dateForTransactions[0], result[0].lastTransaction));
assert(_.isEqual(dateForTransactions[1], result[1].lastTransaction));
done();
});
});
it('find an instance by id', function(done) {
Account.findById(1, function(err, result) {
assert(!err);
assert(result);
assert(_.isEqual(data[0].amount, result.amount));
assert(_.isEqual(dateForTransactions[0], result.lastTransaction));
done();
});
});
it('update an instance', function(done) {
var updatedData = {
type: 'Student - Basic',
amount: 1155.77,
users: {},
};
Account.update({id: 1}, updatedData, function(err, result) {
assert(!err);
assert(result);
assert(result.count);
assert.equal(1, result.count);
done();
});
});
});
it('should run migration', function(done) { it('should run migration', function(done) {
db.automigrate(function() { db.automigrate(function() {
done(); done();