Sequelize migration add" IF NOT EXISTS"添加到addIndex和addColumn

时间:2017-03-08 16:45:02

标签: postgresql sequelize.js

有没有办法强制Sequelize.js将IF NOT EXISTS添加到queryInterface.addColumnqueryInterface.addIndex方法创建的Postgres SQL中?

根据Postgres文档,Alter Table Add Column以及Create Index支持

我已经查看了Sequelize.js文档而没有任何运气,我已经尝试通过代码来弄清楚SQL是如何生成的,但我还没有运气。

一些背景,或者"为什么"

我正在尝试为现有的postgres实例创建一个迁移策略,我现在创建了一个Sequelize迁移集,它从" nothing"到当前架构。现在我想简单地在我的生产服务器上启动并运行所有数据已存在,以便下次创建迁移时,我可以运行它。

所有这些都适用于每个queryInterface.createTable,因为IF NOT EXISTS会自动添加。

4 个答案:

答案 0 :(得分:4)

addColumn函数来自名为addColumnQueryqueryGenerator方法,它接受三个参数 - tablekeydataType。使用它们可以创建一个类似于

的查询
let query = `ALTER TABLE ${quotedTable} ADD COLUMN ${quotedKey} ${definition};`;

因此,正如您所看到的,没有选项可以将IF NOT EXISTS子句添加到查询字符串中。遗憾的是,这同样涉及addIndex方法。但是,您可以使用普通查询来执行某些非典型操作

queryInterface.sequelize.query(...);

答案 1 :(得分:2)

一个小例子:

<template>
  <div>
    <vue-good-table
      :columns="columns"
      :rows="rows"/>
  </div>
</template>

<script>
export default {
  name: 'my-table',
  data(){
    return {
      columns: [
        {
          label: 'Name',
          field: 'name',
        },
        {
          label: 'Age',
          field: 'age',
          type: 'number',
        },
        {
          label: 'Created On',
          field: 'createdAt',
          type: 'date',
          dateInputFormat: 'yyyy-MM-dd',
          dateOutputFormat: 'MMM Do yy',
        },
        {
          label: 'Percent',
          field: 'score',
          type: 'percentage',
        },
      ],
      rows: [
        { id:1, name:"John", age: 20, createdAt: '',score: 0.03343 },
        { id:2, name:"Jane", age: 24, createdAt: '2011-10-31', score: 0.03343 },
      ],
    };
  },
};
</script>

答案 2 :(得分:1)

我有类似的问题,除了我的情况,我只对addColumn感兴趣,如果不存在。

您可以使用queryInterface.describeTable通过两步解决方案实现此目标。 给定表名,函数将返回包含所有现有列的表定义。如果您需要添加的列不存在,请调用queryInterface.addColumn函数。

const tableName = 'your_table_name';

queryInterface.describeTable(tableName)
  .then(tableDefinition => {
    if (!tableDefinition.yourColumnName) return Promise.resolve();

    return queryInterface.addColumn(
      tableName,
      'your_column_name',
      { type: Sequelize.STRING } // or a different column
    );
  });

答案 3 :(得分:0)

语句if (!tableDefinition.yourColumnName)将无法检查列是否存在。 正确的方法是

return queryInterface.describeTable(tableName).then(tableDefinition => {
            if (!tableDefinition[columnName]){
                return queryInterface.addColumn(tableName, columnName, {
                    type: Sequelize.JSON
                });
            } else {
                return Promise.resolve(true);
            }
        });