Allow explicit data types
Override columnDataType function Add test cases Apply feedback Use date type as explicit datatype
This commit is contained in:
parent
fc55994d8c
commit
44083e43c1
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue