Sequelize schema for PostgreSQL:如何准确定义模型中的模式?

Sequelize schema for PostgreSQL: How to accurately define a schema in a model?

我在网上搜索过,但无法确定如何向下面的这个续集模型添加模式。以下代码不会回滚错误,但是当我检查 postgres 数据库时,唯一的模式是 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;

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

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

您的模型定义应如下所示

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() 之前,或者,如果您使用迁移,作为第一个迁移文件。

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

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

这将在架构 public 而不是我的默认架构中创建 table。

在创建模型之前尝试以编程方式创建模式。

在导入语句后立即添加此代码。

将“some_schema”替换为您的“架构名称”

文件:models/index.js

1.JavaScript 实施

 (async function () {
  await sequelize.showAllSchemas({ logging: false }).then(async (data) => {
        if (!data.includes('some_schema')) {
         await sequelize.createSchema('some_schema');
        }
        if (!data.includes('some_schema2')) {
         await sequelize.createSchema('some_schema2');
       }
  });
}());

提示:第一次 npm start 将抛出模式不存在的错误,关闭 npm 终端并再次 npm start,由于异步性质,第二次将正常运行而不会出现任何错误。

2.Typescript 实施:

(async function () {
  const allSchema: Array<string> = await sequelize
    .showAllSchemas({ logging: false })
    .then((data) => data.map((ele) => ele.toString()));
  if (!allSchema.includes('some_schema')) {
    await sequelize.createSchema('some_schema', { logging: false });
  }
})();