水线ORM删除列并转换为mysql的myisam



我对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默认的新表

最新更新