我对NodeJS完全陌生。我正在尝试使用mysql数据库构建一个express应用程序(而不是sails应用程序)。我遇到了一个奇怪的问题,Waterline 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的节点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);
});
});
});接下来,我只需在bash中执行node start.js来运行此应用程序。然后,当我进入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
发布于 2015-07-28 17:44:48
该列将被删除,因为默认情况下waterline使用migrate: 'alter'删除所有表,重新创建它们并重新添加数据。为了防止现有数据被修改,我建议使用migrate: 'create',它只添加新的表/列。要防止数据和模式被更改,请使用migrate: 'safe' (这是生产环境中的推荐设置)。在waterline docs和adapter interface specification上有更多关于这个的信息。顺便说一句,在v0.11中默认值应该更改为'safe'。
关于引擎,它也会因为迁移'alter'而改变,我怀疑MyISAM是新表的sails-mysql默认设置。
https://stackoverflow.com/questions/31644841
复制相似问题