2017-02-27 83 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); 
     }); 

這將在模式公共中創建表,而不是我的默認模式。