2017-02-27 88 views
1

我搜索了整个网络,并且无法确定如何将模式添加到下面的这个sequelize模型中。下面的代码不会反馈错误,但是当我检查postgres数据库时,唯一的模式是公共的默认模式。PostgreSQL的Sequelize模式:如何在模型中准确定义模式?

// The model definition is done in /path/to/models/project.js 
module.exports = function(sequelize, DataTypes) { 
    return sequelize.define("project", { 
    name: DataTypes.STRING, 
    description: DataTypes.TEXT, 
    }, 
    define: { 
     schema: "prefix" 
    }, 
    classMethods: { 
     method1: function() {}, 
     method2: function() {} 
    }, 
    instanceMethods: { 
     method3: function() {} 
    }) 

应如何修改脚本以准确定义模式?

编辑

在我的情况下,最后的答案是

database_name.sequelize.createSchema('prefix').then(() => {...}); 
我./models/index.js

文件数据库对象如下:

database_name = { 
    Sequelize: Sequelize, 
    sequelize: sq, 
    table_1: sq.import(__dirname + '/file_folder') 
}; 

module.exports = database_name; 

回答

4

你的模型定义应如下所示

module.exports = function(sequelize, DataTypes) { 

    return sequelize.define("project", { 
     name: DataTypes.STRING, 
     description: DataTypes.TEXT, 
    }, { 
     schema: 'prefix', 
     classMethods: { 
      method1: function() {}, 
      method2: function() {} 
     }, 
     instanceMethods: { 
      method3: function() {} 
     } 
    } 
} 

根据options对象在sequelize.define方法的文档,它可以有属性叫schema

编辑 - 创建架构编程

为了创建一个新的模式(!只限于PostgreSQL),你可以使用sequelize.createSchema()方法:

sequelize.createSchema('prefix').then(() => { 
    // new schema is created 
}); 

上面创建一个给定的SQL

CREATE SCHEMA prefix; 

为了在模型定义中使用此模式,您需要在同步之前创建模式任何模型到数据库中 - 它可以在sequelize.sync()之前运行,或者如果使用迁移,则可以作为第一个迁移文件运行。

+0

这不起作用。它踢回“架构不存在” – JnL

+0

您是否使用'sequelize.sync()'同步数据库或者使用迁移? – piotrbienias

+0

因为在定义模型之前需要创建模式 – piotrbienias

0

我认为您需要在创建表迁移文件中定义架构,如下所示:

queryInterface.createTable(
    'nameOfTheNewTable', 
    { 
    id: { 
     type: Sequelize.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    createdAt: { 
     type: Sequelize.DATE 
    }, 
    updatedAt: { 
     type: Sequelize.DATE 
    }, 
    attr1: Sequelize.STRING, 
    attr2: Sequelize.INTEGER, 
    attr3: { 
     type: Sequelize.BOOLEAN, 
     defaultValue: false, 
     allowNull: false 
    }, 
    //foreign key usage 
    attr4: { 
     type: Sequelize.INTEGER, 
     references: { 
      model: 'another_table_name', 
      key: 'id' 
     }, 
     onUpdate: 'cascade', 
     onDelete: 'cascade' 
    } 
    }, 
    { 
    engine: 'MYISAM',      // default: 'InnoDB' 
    charset: 'latin1',     // default: null 
    schema: 'prefix'      // default: public, PostgreSQL only. 
    } 
+0

这将更改默认架构。问题是特定于改变特定模型的模式。 – JnL

0

该代码可以使用 “sequelize”: “^ 4.23.2”, “PG”: “^ 7.4.0”, “PG-hstore”: “^ 2.3.2”,

const User = sequelize.define('people', { 
     uuid: { 
      type: Sequelize.UUID, 
      defaultValue: Sequelize.UUIDV1, 
      primaryKey: true 
     }, 
     username: Sequelize.STRING, 
     email: Sequelize.STRING, 
     birthday: Sequelize.DATE 
    }, { 
      schema: 'public', 
     }); 

    sequelize.sync() 
     .then(() => User.create({ 
      username: 'MartialDoane', 
      email: '[email protected]', 
      birthday: new Date(1977, 6, 11) 
     })) 
     .then(jane => { 
      console.log(jane.toJSON()); 

      res.send(jane); 
      res.status(200); 
     }); 

这将在模式公共中创建表,而不是我的默认模式。