我对NodeJS完全陌生。我试图建立一个快速应用程序(不是风帆应用程序)与mysql数据库。我有一个奇怪的问题,在那里水线ORM是出乎意料地在我的mysql数据库表和转换引擎类型从innodb到myisam的一个列。下面是我重现这个错误的代码。
首先,我通过mysql终端创建了几个mysql数据库表:
CREATE TABLE IF NOT EXISTS `c` (
`c_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`d_id` int(11) UNSIGNED NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `d` (
`d_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`c_id` int(11) UNSIGNED NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`d_id`),
CONSTRAINT `d_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `c`(`c_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后我有一个名为start.js
的node js文件它的代码是:
var express = require("express");
var app = express();
var Waterline = require("waterline");
var orm = new Waterline();
//////////////////////////////////////////////////////////////////
// WATERLINE CONFIG
//////////////////////////////////////////////////////////////////
// Require any waterline compatible adapters here
var diskAdapter = require('sails-disk'),
mysqlAdapter = require('sails-mysql');
// Build A Config Object
var config = {
// Setup Adapters
// Creates named adapters that have have been required
adapters: {
'default': diskAdapter,
disk: diskAdapter,
mysql: mysqlAdapter
},
// Build Connections Config
// Setup connections using the named adapter configs
connections: {
myLocalDisk: {
adapter: 'disk'
},
myLocalMySql: {
adapter: 'mysql',
host: 'localhost',
database: 'waterdb',
user: 'mysqluser',
password: 'mybordingpassword'
}
}
};
var D = Waterline.Collection.extend({
tableName: 'd',
identity: 'd',
connection: 'myLocalMySql',
attributes: {
d_id: {type:'integer'},
name: {type:'string'}
}
});
orm.loadCollection(D);
app.listen(3000,function(){
console.log("Running Server on Port 3000.");
orm.initialize(config, function(err, models) {
if(err) throw err;
app.models = models.collections;
app.connections = models.connections;
app.models.d.find().exec(function(err,models){
if(err) return res.json({ err: err }, 500);
console.log(models);
});
});
});
接下来,我只是通过执行node start.js
从bash运行这个应用程序。然后,当我进入mysql并执行show create table d
时,我看到了结果:
CREATE TABLE `d` (
`d_id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`createdAt` datetime DEFAULT NULL,
`updatedAt` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
为什么我的节点js代码删除列c_id并将表d
的引擎更改为myisam ?
列正在被删除,因为默认情况下waterline使用migrate: 'alter'
删除所有表,重新创建它们并重新添加数据。为了防止现有的数据被触及,我建议使用migrate: 'create'
,它只添加新的表/列。为了防止数据和模式被更改,请使用migrate: 'safe'
(这是生产环境的推荐设置)。关于这一点,请参阅水线文档和适配器接口规范。顺便说一句,这个默认值应该在v0.11中更改为'safe'
。
关于引擎,由于迁移'alter'
,它也发生了变化,我怀疑MyISAM
是sail -mysql默认的新表