首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Waterline ORM删除列并转换为myisam for mysql?

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

Stack Overflow用户
提问于 2015-07-27 12:08:48
回答 1查看 421关注 0票数 2

我对NodeJS完全陌生。我正在尝试使用mysql数据库构建一个express应用程序(而不是sails应用程序)。我遇到了一个奇怪的问题,Waterline ORM意外地删除了我的mysql数据库表中的一列,并将引擎类型从innodb转换为myisam。下面是我的重现错误的代码。

首先,我通过mysql终端创建了两个mysql数据库表:

代码语言:javascript
复制
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文件,其中包含以下代码:

代码语言:javascript
复制
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时,我会看到结果:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-07-28 17:44:48

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

关于引擎,它也会因为迁移'alter'而改变,我怀疑MyISAM是新表的sails-mysql默认设置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31644841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档