有没有办法强制Sequelize.js将IF NOT EXISTS
添加到queryInterface.addColumn
和queryInterface.addIndex
方法创建的Postgres SQL中?
根据Postgres文档,Alter Table Add Column以及Create Index支持
我已经查看了Sequelize.js文档而没有任何运气,我已经尝试通过代码来弄清楚SQL是如何生成的,但我还没有运气。
我正在尝试为现有的postgres实例创建一个迁移策略,我现在创建了一个Sequelize迁移集,它从" nothing"到当前架构。现在我想简单地在我的生产服务器上启动并运行所有数据已存在,以便下次创建迁移时,我可以运行它。
所有这些都适用于每个queryInterface.createTable
,因为IF NOT EXISTS
会自动添加。
答案 0 :(得分:4)
addColumn
函数来自名为addColumnQuery
的queryGenerator
方法,它接受三个参数 - table
,key
和dataType
。使用它们可以创建一个类似于
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);
}
});