PostgreSQL的Sequelize架构:如何在模型中准确定义架构?

时间:2017-02-27 22:51:26

标签: node.js postgresql schema sequelize.js database-schema

我在整个网络中进行了搜索,但无法确定如何在下面的此续集模型中添加架构。以下代码不会回显错误,但是当我检查postgres DB时,唯一的模式是public的默认模式。

// 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;

3 个答案:

答案 0 :(得分:6)

您的模型定义应如下所示

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() {}
        }
    }
}

根据sequelize.define方法中options对象的文档,它可以包含名为schema的属性。

编辑 - 以编程方式创建架构

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

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

上面创建给定的SQL

CREATE SCHEMA prefix;

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

答案 1 :(得分:0)

我认为您需要在create table migration file中定义架构,如下所示:

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.
  }   

答案 2 :(得分:0)

此代码适用于" sequelize":" ^ 4.23.2"," pg":" ^ 7.4.0",& #34; 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: 'martial-doane@gmail.com',
            birthday: new Date(1977, 6, 11)
        }))
        .then(jane => {
            console.log(jane.toJSON());

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

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