水线ORM删除列,并转换为myisam的MySQL?

我对NodeJS是全新的。 我试图build立一个快速的应用程序(而不是一个帆的应用程序)与MySQL数据库。 我有一个奇怪的问题,Waterline ORM意外地在我的一个mysql数据库表中删除一列,并将引擎types从innodb转换为myisam。 这是我的代码来重现错误。

首先,我通过mysqlterminal创build了一对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的节点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并将引擎更改为myisam表d

该列正在被丢弃,因为默认情况下,水线使用migrate: 'alter' ,它删除所有表,重新创build它们并重新添加数据。 为了防止现有的数据被触及,我build议使用migrate: 'create' ,它只添加新的表/列。 为了防止数据和模式被改变,使用migrate: 'safe' (这是推荐的生产设置)。 关于waterline文档和适配器接口规范的更多信息 。 顺便说一句,这个默认值应该在v0.11更改为'safe'

关于引擎,由于迁移'alter' ,它也在变化,我怀疑MyISAM是新表的sails-mysql默认值。