2017-04-11 50 views
0

我正在使用sequelize-auto來從我的數據庫生成數據類型,它工作得很好。結果是這樣的:如何使用Node.js從Sequelize數據類型創建Breeze元數據?

module.exports = function(sequelize, DataTypes) { 
return sequelize.define('ReportTasks', { 
    ReportTaskID: { 
     type: DataTypes.INTEGER, 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    BatchID: { 
     type: DataTypes.INTEGER, 
     allowNull: true, 
     references: { 
      model: 'ReportBatches', 
      key: 'BatchID' 
     } 
    }, 
    Name: { 
     type: DataTypes.STRING, 
     allowNull: true 
    }, 
    Year: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    }, 
    Month: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    }, 
    CompanyKey: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    }, 
    CompanyName: { 
     type: DataTypes.STRING, 
     allowNull: true 
    }, 
    StartDate: { 
     type: DataTypes.DATE, 
     allowNull: true 
    }, 
    EndDate: { 
     type: DataTypes.DATE, 
     allowNull: true 
    }, 
    Status: { 
     type: DataTypes.STRING, 
     allowNull: true 
    } 
}, { 
    tableName: 'ReportTasks' 
}); 

};

現在我試圖設置Breeze服務器,它需要元數據。這些示例從json文件中提取元數據,但我想從我的模型中構建元數據。我怎樣才能做到這一點?

這是從例子(http://breeze.github.io/doc-node-sequelize/introduction.html)代碼:

function createSequelizeManager() { 
    var metadata = readMetadata(); 
    var sm = new SequelizeManager(dbConfig, sequelizeOptions); 
    sm.importMetadata(metadata); 
    return sm; 
} 

function readMetadata() { 
    var filename = "TodoMetadata.json"; 
    if (!fs.existsSync(filename)) { 
     throw new Error("Unable to locate file: " + filename); 
    } 
    var metadata = fs.readFileSync(filename, 'utf8'); 
    return JSON.parse(metadata); 
} 
+0

目前[MetadataMapper(https://開頭github.com/Breeze/breeze.server.node/blob/master/breeze-sequelize/src/MetadataMapper.js)只能從[Breeze元數據](http://breeze.github.io/doc- js/metadata-schema.html#metadata-example)到Sequelize。如果有一種工具可以採用另一種方式,尤其是使用'sequelize-auto'時,那將是非常好的。 –

+0

嗨史蒂夫,感謝您的評論...我實際上黑了一個工具去其他方式,並得到它的工作...非常醜陋,不支持大多數數據類型,但現在爲我工作 –

回答

0

所以......我砍死了刀具的超基本開始做這個反向映射。它不支持除int,string,bool,date之外的任何數據類型,但這就是我現在需要的。

它執行sequelize-auto生成的模型併爲微風創建半可用的元數據規範。

這裏的總體思路(不要評判我,我知道它的壞的):

var Sequelize = require('sequelize'); 
var SequelizeAuto = require('sequelize-auto') 
var fs = require('fs'); 
var jsonfile = require('jsonfile'); 

var config = require('./config'); 

var auto = new SequelizeAuto(config.database.name, config.database.username, config.database.password, { 
    dialect: config.database.dialect, 
    dialectModulePath: config.database.dialectModulePath, 
    dialectOptions: { 
     driver: config.database.driver, 
     instanceName: config.database.instanceName 
    }, 
    directory: './models', 
    host: config.database.host, 
    username: config.database.username, 
    password: config.database.password, 
    database: config.database.name, 
    tables: config.database.tables, 
    define: { 
     timestamps: false 
    } 
}); 

var tables; 
var foreignKeys; 

var metadata = { 
    "metadataVersion": "1.0.5", 
    "namingConvention": "noChange", 
    "localQueryComparisonOptions": "caseInsensitiveSQL", 
    "dataServices": [ 
     { 
      "serviceName": "breeze/", 
      "hasServerMetadata": true, 
      "jsonResultsAdapter": "webApi_default", 
      "useJsonp": false 
     } 
    ], 
    "structuralTypes": [], 
}; 

auto.run(function (err) { 
    if (err) throw err; 

    createMetadata(auto.tables); 

}); 

function createMetadata(tables) { 

    // now create metadata 
    Object.keys(auto.tables).forEach(function (tableName) { 

     var table = auto.tables[tableName]; 
     var structuralType = transformTable(tableName); 

     var fieldIndex = 0; 
     Object.keys(table).forEach(function (field) { 
      var val = table[field]; 
      var dataProperty = transformField(fieldIndex, field, val); 
      structuralType.dataProperties.push(dataProperty); 
      fieldIndex++; 
     }); 

     // add to metadata 
     metadata.structuralTypes.push(structuralType); 
    }); 

    console.log('metadata', metadata); 

    // write to file 
    jsonfile.writeFile('./metadata/metadata.json', metadata, { spaces: 2 }, function (err) { 
     console.log(err); 
    }); 
} 

function transformTable(tableName) { 
    return { 
     "shortName": tableName, 
     "namespace": "Models", 
     "autoGeneratedKeyType": "Identity", 
     "defaultResourceName": tableName, 
     "dataProperties": [] 
    }; 
} 

function transformField(fieldIndex, field, val) { 
    var result = { 
     "name": field, 
     "dataType": _dataTypeMap[val.type] || 'String', 
     "isPartOfKey": fieldIndex == 0 ? true : false, 
     "isNullable": !!val.allowNull, 
     "defaultValue": val.defaultValue, 
     "validators": [], 
    }; 

    if (!val.allowNull) { 
     result.validators.push({ "name": "required" }); 
    } 

    return result; 
} 

// todo - add support for all types 
var _dataTypeMap = { 
    NVARCHAR: 'String', 
    BIT: 'Boolean', 
    DATETIME: 'DateTime', 
    INT: 'Int32' 
}; 
相關問題