gpt4 book ai didi

mysql - Waterline ORM 删除列并转换为 myisam for mysql?

转载 作者:行者123 更新时间:2023-11-29 02:21:09 24 4
gpt4 key购买 nike

我是 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 的 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

为什么我的 Node js 代码删除了 c_id 列并将表 d 的引擎更改为 myisam?

最佳答案

该列正在被删除,因为默认情况下水线使用 migrate: 'alter' 删除所有表,重新创建它们并重新添加数据。为了防止现有数据被触及,我建议使用 migrate: 'create' ,它只会添加新表/列。为防止数据和架构被更改,请使用 migrate: 'safe'(这是生产环境的推荐设置)。有关更多信息,请访问 waterline docsadapter interface specification 上.顺便说一句,此默认值应在 v0.11 中更改为 'safe'

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

关于mysql - Waterline ORM 删除列并转换为 myisam for mysql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31644841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com