【问题标题】:Sequelize schema for PostgreSQL: How to accurately define a schema in a model?Sequelize schema for PostgreSQL:如何准确定义模型中的模式?
【发布时间】:2017-07-18 17:53:23
【问题描述】:

我搜索了整个网络,但无法确定如何将架构添加到下面的此续集模型中。以下代码不会回退错误,但是当我检查 postgres 数据库时,唯一的架构是公共的默认架构。

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

【问题讨论】:

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


    【解决方案1】:

    您的模型定义应如下所示

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

    【讨论】:

    • 这不起作用。它踢回“模式不存在”
    • 你是使用sequelize.sync()同步数据库还是使用迁移?
    • 因为在其中定义模型之前需要先创建一个模式
    • 我还没有使用迁移。是的,我使用 sequelize.sync() 来同步数据库。我可以不通过 CLI 以编程方式定义它吗?
    • 我已经编辑了答案以包含架构创建部分
    【解决方案2】:

    我认为您需要像这样在创建表迁移文件中定义架构:

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

    【讨论】:

    • 这将更改默认架构。该问题专门针对更改特定模型的架构。
    【解决方案3】:

    此代码适用于“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 的模式下有表,所以我在模型中添加了 {schema: 'public'} 但查找查询返回空对象
    猜你喜欢
    • 2018-09-08
    • 2020-01-20
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多