Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sequelize.js as ORM #26

Open
khwerhahn opened this issue Apr 16, 2015 · 10 comments
Open

sequelize.js as ORM #26

khwerhahn opened this issue Apr 16, 2015 · 10 comments

Comments

@khwerhahn
Copy link

Is there a general interest to support sequelize.js? mongo isn't always going to work for every project.

@ericmdantas
Copy link
Owner

I have never used it, but it's a good idea.

I'd need help with the dev, though. I don't know its best practices.

@khwerhahn
Copy link
Author

Hi @ericmdantas,

I'm glad to help out soon, but I'm currently busy and don't have much time to spare.

In https://github.com/DaftMonk/generator-angular-fullstack/tree/canary they have included it into the project. I'm using the generator for a current project, but have diverted a little bit from how it was implemented there. I keep all models in a model folder which are are loaded in via the index.js in the same folder. There was a reason for this though, since I had to build on top of an existing database and I used sequelize-auto to auto import all the models. But I generally like to have the models all in one folder.

Hope this helps

'use strict';

var fs = require("fs");
var path = require("path");
var config = require('../config/environment');
var Sequelize = require("sequelize");
//var sequelize = new Sequelize(config.dbUrl);
var sequelize = new Sequelize(config.dbUrl.database, config.dbUrl.user, config.dbUrl.password, 
    { 
        host: config.dbUrl.host, 
        dialect: 'postgres', 
        sync: { force: true },
        logging: config.dbUrl.logging,
    });

var db = {};
fs
.readdirSync(__dirname)
.filter(function(file) {
  return (file.indexOf(".") !== 0) && (file.indexOf('.spec.') === -1) && (file !== "index.js");
})
.forEach(function(file) {
  var model = sequelize["import"](path.join(__dirname, file));
  db[model.name] = model;
});

Object.keys(db).forEach(function(modelName) {
if ("associate" in db[modelName]) {
  db[modelName].associate(db);
}
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

The app.js:

'use strict';

// Set default node environment to development
process.env.NODE_ENV = process.env.NODE_ENV || 'development';

var express = require('express');
var models = require('./models');
var config = require('./config/environment');

// Setup server
var app = express();
var server = require('http').createServer(app);
var socketio = require('socket.io')(server, {
  serveClient: (config.env === 'production') ? false : true,
  path: '/socket.io-client'
});

require('./config/socketio')(socketio);
require('./config/express')(app);
require('./routes')(app);

var forcedrop = (config.seedDB) ? true : false;

models.sequelize.sync({ force: forcedrop }).success(function () {
  // Populate DB with sample data
  if (config.seedDB) {
     require('./config/seed');
  }

});

exports = module.exports = app;

A typical model would look like this:

address.js

'use strict';

module.exports = function(sequelize, DataTypes) {
  var Address = sequelize.define('address', {

    lat: {
        type: DataTypes.DECIMAL(10,8),
        allowNull: true,
        defaultValue: null,
        validate: { min: -90, max: 90 }
    },
    lng: {
        type: DataTypes.DECIMAL(10,8),
        allowNull: true,
        defaultValue: null,
        validate: { min: -180, max: 180 }
    },
    customer_id: {
      type: DataTypes.INTEGER,
      allowNull: false
    }

  },{
  underscored: true,
   paranoid: true,
    validate: {

        bothCoordsOrNone: function() {
          if ((this.lat === null) === (this.lng === null)) {
            throw new Error('Require either both lat and lng or neither')
          }
        }

    },
    classMethods: {
        associate: function (models) {
          Address.belongsTo(models.customer, { foreignKey:'customer_id'})
        }
    }
  });

  return Address;
}

@ericmdantas
Copy link
Owner

@khwerhahn, that's very helpful!

I'll take a closer look asap and I'll see where this fits. Thanks!

@dmarcelino
Copy link

I'm also tight on time right now due to a deadline closing soon, but one thing I would like to help with would be integrating waterline. Waterline is a multi-adapter ORM with official support for MySQL, PostgreSQL, Mongo, Redis, local memory and disk. Community adapters exist for less mainstream data stores.

Perhaps the biggest disadvantage of waterline compared to sequelize is that it currently doesn't support transactions (balderdashy/waterline#755). Still, there are talks about using knexjs as core component of their SQL adapters (balderdashy/waterline#605) so people could get the best of both worlds.

In the project I'm working now we are using generator-angular-fullstack with waterline instead of mongoose and so far I'm enjoying it :)

@ericmdantas
Copy link
Owner

@dmarcelino I personally have never used it, but it'd be great to have such integration.

I also have been very busy, but I'd definetely merge a PR on the subject.

@itrethan
Copy link

+1 for sequelize.js

@justcfx2u
Copy link

SQL is also a requirement for my latest project. Sequelize.js support out-of-the-box would definitely help here.

@johnnyPescarul
Copy link

johnnyPescarul commented Jun 2, 2016

+1 for sequelize

@ericmdantas
Copy link
Owner

Could anyone use the base of generator as of now and switch from MongoDB/Mongoose to Sequelize? I'd gladly accept the PR and land it on 1.9.

@amarewgs
Copy link

amarewgs commented Jun 8, 2016

+1 for sequelize.js

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants