{ "version": 3, "sources": ["../../../src/dialects/abstract/query-interface.js"], "sourcesContent": ["'use strict';\n\nconst _ = require('lodash');\n\nconst Utils = require('../../utils');\nconst DataTypes = require('../../data-types');\nconst Transaction = require('../../transaction');\nconst QueryTypes = require('../../query-types');\n\n/**\n * The interface that Sequelize uses to talk to all databases\n */\nclass QueryInterface {\n constructor(sequelize, queryGenerator) {\n this.sequelize = sequelize;\n this.queryGenerator = queryGenerator;\n }\n\n /**\n * Create a database\n *\n * @param {string} database Database name to create\n * @param {object} [options] Query options\n * @param {string} [options.charset] Database default character set, MYSQL only\n * @param {string} [options.collate] Database default collation\n * @param {string} [options.encoding] Database default character set, PostgreSQL only\n * @param {string} [options.ctype] Database character classification, PostgreSQL only\n * @param {string} [options.template] The name of the template from which to create the new database, PostgreSQL only\n *\n * @returns {Promise}\n */\n async createDatabase(database, options) {\n options = options || {};\n const sql = this.queryGenerator.createDatabaseQuery(database, options);\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Drop a database\n *\n * @param {string} database Database name to drop\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async dropDatabase(database, options) {\n options = options || {};\n const sql = this.queryGenerator.dropDatabaseQuery(database);\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Create a schema\n *\n * @param {string} schema Schema name to create\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async createSchema(schema, options) {\n options = options || {};\n const sql = this.queryGenerator.createSchema(schema);\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Drop a schema\n *\n * @param {string} schema Schema name to drop\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async dropSchema(schema, options) {\n options = options || {};\n const sql = this.queryGenerator.dropSchema(schema);\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Drop all schemas\n *\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async dropAllSchemas(options) {\n options = options || {};\n\n if (!this.queryGenerator._dialect.supports.schemas) {\n return this.sequelize.drop(options);\n }\n const schemas = await this.showAllSchemas(options);\n return Promise.all(schemas.map(schemaName => this.dropSchema(schemaName, options)));\n }\n\n /**\n * Show all schemas\n *\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async showAllSchemas(options) {\n options = {\n ...options,\n raw: true,\n type: this.sequelize.QueryTypes.SELECT\n };\n\n const showSchemasSql = this.queryGenerator.showSchemasQuery(options);\n\n const schemaNames = await this.sequelize.query(showSchemasSql, options);\n\n return _.flatten(schemaNames.map(value => value.schema_name ? value.schema_name : value));\n }\n\n /**\n * Return database version\n *\n * @param {object} [options] Query options\n * @param {QueryType} [options.type] Query type\n *\n * @returns {Promise}\n * @private\n */\n async databaseVersion(options) {\n return await this.sequelize.query(\n this.queryGenerator.versionQuery(),\n { ...options, type: QueryTypes.VERSION }\n );\n }\n\n /**\n * Create a table with given set of attributes\n *\n * ```js\n * queryInterface.createTable(\n * 'nameOfTheNewTable',\n * {\n * id: {\n * type: Sequelize.INTEGER,\n * primaryKey: true,\n * autoIncrement: true\n * },\n * createdAt: {\n * type: Sequelize.DATE\n * },\n * updatedAt: {\n * type: Sequelize.DATE\n * },\n * attr1: Sequelize.STRING,\n * attr2: Sequelize.INTEGER,\n * attr3: {\n * type: Sequelize.BOOLEAN,\n * defaultValue: false,\n * allowNull: false\n * },\n * //foreign key usage\n * attr4: {\n * type: Sequelize.INTEGER,\n * references: {\n * model: 'another_table_name',\n * key: 'id'\n * },\n * onUpdate: 'cascade',\n * onDelete: 'cascade'\n * }\n * },\n * {\n * engine: 'MYISAM', // default: 'InnoDB'\n * charset: 'latin1', // default: null\n * schema: 'public', // default: public, PostgreSQL only.\n * comment: 'my table', // comment for table\n * collate: 'latin1_danish_ci' // collation, MYSQL only\n * }\n * )\n * ```\n *\n * @param {string} tableName Name of table to create\n * @param {object} attributes Object representing a list of table attributes to create\n * @param {object} [options] create table and query options\n * @param {Model} [model] model class\n *\n * @returns {Promise}\n */\n async createTable(tableName, attributes, options, model) {\n let sql = '';\n\n options = { ...options };\n\n if (options && options.uniqueKeys) {\n _.forOwn(options.uniqueKeys, uniqueKey => {\n if (uniqueKey.customIndex === undefined) {\n uniqueKey.customIndex = true;\n }\n });\n }\n\n if (model) {\n options.uniqueKeys = options.uniqueKeys || model.uniqueKeys;\n }\n\n attributes = _.mapValues(\n attributes,\n attribute => this.sequelize.normalizeAttribute(attribute)\n );\n\n // Postgres requires special SQL commands for ENUM/ENUM[]\n await this.ensureEnums(tableName, attributes, options, model);\n\n if (\n !tableName.schema &&\n (options.schema || !!model && model._schema)\n ) {\n tableName = this.queryGenerator.addSchema({\n tableName,\n _schema: !!model && model._schema || options.schema\n });\n }\n\n attributes = this.queryGenerator.attributesToSQL(attributes, {\n table: tableName,\n context: 'createTable',\n withoutForeignKeyConstraints: options.withoutForeignKeyConstraints\n });\n sql = this.queryGenerator.createTableQuery(tableName, attributes, options);\n\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Returns a promise that will resolve to true if the table exists in the database, false otherwise.\n *\n * @param {TableName} tableName - The name of the table\n * @param {QueryOptions} options - Query options\n * @returns {Promise}\n */\n async tableExists(tableName, options) {\n const sql = this.queryGenerator.tableExistsQuery(tableName);\n\n const out = await this.sequelize.query(sql, {\n ...options,\n type: QueryTypes.SHOWTABLES\n });\n\n return out.length === 1;\n }\n\n /**\n * Drop a table from database\n *\n * @param {string} tableName Table name to drop\n * @param {object} options Query options\n *\n * @returns {Promise}\n */\n async dropTable(tableName, options) {\n // if we're forcing we should be cascading unless explicitly stated otherwise\n options = { ...options };\n options.cascade = options.cascade || options.force || false;\n\n const sql = this.queryGenerator.dropTableQuery(tableName, options);\n\n await this.sequelize.query(sql, options);\n }\n\n async _dropAllTables(tableNames, skip, options) {\n for (const tableName of tableNames) {\n // if tableName is not in the Array of tables names then don't drop it\n if (!skip.includes(tableName.tableName || tableName)) {\n await this.dropTable(tableName, { ...options, cascade: true } );\n }\n }\n }\n\n /**\n * Drop all tables from database\n *\n * @param {object} [options] query options\n * @param {Array} [options.skip] List of table to skip\n *\n * @returns {Promise}\n */\n async dropAllTables(options) {\n options = options || {};\n const skip = options.skip || [];\n\n const tableNames = await this.showAllTables(options);\n const foreignKeys = await this.getForeignKeysForTables(tableNames, options);\n\n for (const tableName of tableNames) {\n let normalizedTableName = tableName;\n if (_.isObject(tableName)) {\n normalizedTableName = `${tableName.schema}.${tableName.tableName}`;\n }\n\n for (const foreignKey of foreignKeys[normalizedTableName]) {\n await this.sequelize.query(this.queryGenerator.dropForeignKeyQuery(tableName, foreignKey));\n }\n }\n await this._dropAllTables(tableNames, skip, options);\n }\n\n /**\n * Rename a table\n *\n * @param {string} before Current name of table\n * @param {string} after New name from table\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async renameTable(before, after, options) {\n options = options || {};\n const sql = this.queryGenerator.renameTableQuery(before, after);\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Get all tables in current database\n *\n * @param {object} [options] Query options\n * @param {boolean} [options.raw=true] Run query in raw mode\n * @param {QueryType} [options.type=QueryType.SHOWTABLE] query type\n *\n * @returns {Promise}\n * @private\n */\n async showAllTables(options) {\n options = {\n ...options,\n raw: true,\n type: QueryTypes.SHOWTABLES\n };\n\n const showTablesSql = this.queryGenerator.showTablesQuery(this.sequelize.config.database);\n const tableNames = await this.sequelize.query(showTablesSql, options);\n return _.flatten(tableNames);\n }\n\n /**\n * Describe a table structure\n *\n * This method returns an array of hashes containing information about all attributes in the table.\n *\n * ```js\n * {\n * name: {\n * type: 'VARCHAR(255)', // this will be 'CHARACTER VARYING' for pg!\n * allowNull: true,\n * defaultValue: null\n * },\n * isBetaMember: {\n * type: 'TINYINT(1)', // this will be 'BOOLEAN' for pg!\n * allowNull: false,\n * defaultValue: false\n * }\n * }\n * ```\n *\n * @param {string} tableName table name\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async describeTable(tableName, options) {\n let schema = null;\n let schemaDelimiter = null;\n\n if (typeof options === 'string') {\n schema = options;\n } else if (typeof options === 'object' && options !== null) {\n schema = options.schema || null;\n schemaDelimiter = options.schemaDelimiter || null;\n }\n\n if (typeof tableName === 'object' && tableName !== null) {\n schema = tableName.schema;\n tableName = tableName.tableName;\n }\n\n const sql = this.queryGenerator.describeTableQuery(tableName, schema, schemaDelimiter);\n options = { ...options, type: QueryTypes.DESCRIBE };\n\n try {\n const data = await this.sequelize.query(sql, options);\n /*\n * If no data is returned from the query, then the table name may be wrong.\n * Query generators that use information_schema for retrieving table info will just return an empty result set,\n * it will not throw an error like built-ins do (e.g. DESCRIBE on MySql).\n */\n if (_.isEmpty(data)) {\n throw new Error(`No description found for \"${tableName}\" table. Check the table name and schema; remember, they _are_ case sensitive.`);\n }\n\n return data;\n } catch (e) {\n if (e.original && e.original.code === 'ER_NO_SUCH_TABLE') {\n throw new Error(`No description found for \"${tableName}\" table. Check the table name and schema; remember, they _are_ case sensitive.`);\n }\n\n throw e;\n }\n }\n\n /**\n * Add a new column to a table\n *\n * ```js\n * queryInterface.addColumn('tableA', 'columnC', Sequelize.STRING, {\n * after: 'columnB' // after option is only supported by MySQL\n * });\n * ```\n *\n * @param {string} table Table to add column to\n * @param {string} key Column name\n * @param {object} attribute Attribute definition\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async addColumn(table, key, attribute, options) {\n if (!table || !key || !attribute) {\n throw new Error('addColumn takes at least 3 arguments (table, attribute name, attribute definition)');\n }\n\n options = options || {};\n attribute = this.sequelize.normalizeAttribute(attribute);\n return await this.sequelize.query(this.queryGenerator.addColumnQuery(table, key, attribute), options);\n }\n\n /**\n * Remove a column from a table\n *\n * @param {string} tableName Table to remove column from\n * @param {string} attributeName Column name to remove\n * @param {object} [options] Query options\n */\n async removeColumn(tableName, attributeName, options) {\n return this.sequelize.query(this.queryGenerator.removeColumnQuery(tableName, attributeName), options);\n }\n\n normalizeAttribute(dataTypeOrOptions) {\n let attribute;\n if (Object.values(DataTypes).includes(dataTypeOrOptions)) {\n attribute = { type: dataTypeOrOptions, allowNull: true };\n } else {\n attribute = dataTypeOrOptions;\n }\n\n return this.sequelize.normalizeAttribute(attribute);\n }\n\n /**\n * Split a list of identifiers by \".\" and quote each part\n *\n * @param {string} identifier\n * @param {boolean} force\n *\n * @returns {string}\n */\n quoteIdentifier(identifier, force) {\n return this.queryGenerator.quoteIdentifier(identifier, force);\n }\n\n /**\n * Split a list of identifiers by \".\" and quote each part.\n *\n * @param {string} identifiers \n * \n * @returns {string}\n */\n quoteIdentifiers(identifiers) {\n return this.queryGenerator.quoteIdentifiers(identifiers);\n }\n\n /**\n * Change a column definition\n *\n * @param {string} tableName Table name to change from\n * @param {string} attributeName Column name\n * @param {object} dataTypeOrOptions Attribute definition for new column\n * @param {object} [options] Query options\n */\n async changeColumn(tableName, attributeName, dataTypeOrOptions, options) {\n options = options || {};\n\n const query = this.queryGenerator.attributesToSQL({\n [attributeName]: this.normalizeAttribute(dataTypeOrOptions)\n }, {\n context: 'changeColumn',\n table: tableName\n });\n const sql = this.queryGenerator.changeColumnQuery(tableName, query);\n\n return this.sequelize.query(sql, options);\n }\n\n /**\n * Rejects if the table doesn't have the specified column, otherwise returns the column description.\n *\n * @param {string} tableName\n * @param {string} columnName\n * @param {object} options\n * @private\n */\n async assertTableHasColumn(tableName, columnName, options) {\n const description = await this.describeTable(tableName, options);\n if (description[columnName]) {\n return description;\n }\n throw new Error(`Table ${tableName} doesn't have the column ${columnName}`);\n }\n\n /**\n * Rename a column\n *\n * @param {string} tableName Table name whose column to rename\n * @param {string} attrNameBefore Current column name\n * @param {string} attrNameAfter New column name\n * @param {object} [options] Query option\n *\n * @returns {Promise}\n */\n async renameColumn(tableName, attrNameBefore, attrNameAfter, options) {\n options = options || {};\n const data = (await this.assertTableHasColumn(tableName, attrNameBefore, options))[attrNameBefore];\n\n const _options = {};\n\n _options[attrNameAfter] = {\n attribute: attrNameAfter,\n type: data.type,\n allowNull: data.allowNull,\n defaultValue: data.defaultValue\n };\n\n // fix: a not-null column cannot have null as default value\n if (data.defaultValue === null && !data.allowNull) {\n delete _options[attrNameAfter].defaultValue;\n }\n\n const sql = this.queryGenerator.renameColumnQuery(\n tableName,\n attrNameBefore,\n this.queryGenerator.attributesToSQL(_options)\n );\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Add an index to a column\n *\n * @param {string|object} tableName Table name to add index on, can be a object with schema\n * @param {Array} [attributes] Use options.fields instead, List of attributes to add index on\n * @param {object} options indexes options\n * @param {Array} options.fields List of attributes to add index on\n * @param {boolean} [options.concurrently] Pass CONCURRENT so other operations run while the index is created\n * @param {boolean} [options.unique] Create a unique index\n * @param {string} [options.using] Useful for GIN indexes\n * @param {string} [options.operator] Index operator\n * @param {string} [options.type] Type of index, available options are UNIQUE|FULLTEXT|SPATIAL\n * @param {string} [options.name] Name of the index. Default is __\n * @param {object} [options.where] Where condition on index, for partial indexes\n * @param {string} [rawTablename] table name, this is just for backward compatibiity\n *\n * @returns {Promise}\n */\n async addIndex(tableName, attributes, options, rawTablename) {\n // Support for passing tableName, attributes, options or tableName, options (with a fields param which is the attributes)\n if (!Array.isArray(attributes)) {\n rawTablename = options;\n options = attributes;\n attributes = options.fields;\n }\n\n if (!rawTablename) {\n // Map for backwards compat\n rawTablename = tableName;\n }\n\n options = Utils.cloneDeep(options);\n options.fields = attributes;\n const sql = this.queryGenerator.addIndexQuery(tableName, options, rawTablename);\n return await this.sequelize.query(sql, { ...options, supportsSearchPath: false });\n }\n\n /**\n * Show indexes on a table\n *\n * @param {string} tableName table name\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n * @private\n */\n async showIndex(tableName, options) {\n const sql = this.queryGenerator.showIndexesQuery(tableName, options);\n return await this.sequelize.query(sql, { ...options, type: QueryTypes.SHOWINDEXES });\n }\n\n\n /**\n * Returns all foreign key constraints of requested tables\n *\n * @param {string[]} tableNames table names\n * @param {object} [options] Query options\n *\n * @returns {Promise}\n */\n async getForeignKeysForTables(tableNames, options) {\n if (tableNames.length === 0) {\n return {};\n }\n\n options = { ...options, type: QueryTypes.FOREIGNKEYS };\n\n const results = await Promise.all(tableNames.map(tableName =>\n this.sequelize.query(this.queryGenerator.getForeignKeysQuery(tableName, this.sequelize.config.database), options)));\n\n const result = {};\n\n tableNames.forEach((tableName, i) => {\n if (_.isObject(tableName)) {\n tableName = `${tableName.schema}.${tableName.tableName}`;\n }\n\n result[tableName] = Array.isArray(results[i])\n ? results[i].map(r => r.constraint_name)\n : [results[i] && results[i].constraint_name];\n\n result[tableName] = result[tableName].filter(_.identity);\n });\n\n return result;\n }\n\n /**\n * Get foreign key references details for the table\n *\n * Those details contains constraintSchema, constraintName, constraintCatalog\n * tableCatalog, tableSchema, tableName, columnName,\n * referencedTableCatalog, referencedTableCatalog, referencedTableSchema, referencedTableName, referencedColumnName.\n * Remind: constraint informations won't return if it's sqlite.\n *\n * @param {string} tableName table name\n * @param {object} [options] Query options\n */\n async getForeignKeyReferencesForTable(tableName, options) {\n const queryOptions = {\n ...options,\n type: QueryTypes.FOREIGNKEYS\n };\n const query = this.queryGenerator.getForeignKeysQuery(tableName, this.sequelize.config.database);\n return this.sequelize.query(query, queryOptions);\n }\n\n /**\n * Remove an already existing index from a table\n *\n * @param {string} tableName Table name to drop index from\n * @param {string|string[]} indexNameOrAttributes Index name or list of attributes that in the index\n * @param {object} [options] Query options\n * @param {boolean} [options.concurrently] Pass CONCURRENTLY so other operations run while the index is created\n *\n * @returns {Promise}\n */\n async removeIndex(tableName, indexNameOrAttributes, options) {\n options = options || {};\n const sql = this.queryGenerator.removeIndexQuery(tableName, indexNameOrAttributes, options);\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Add a constraint to a table\n *\n * Available constraints:\n * - UNIQUE\n * - DEFAULT (MSSQL only)\n * - CHECK (MySQL - Ignored by the database engine )\n * - FOREIGN KEY\n * - PRIMARY KEY\n *\n * @example \n * queryInterface.addConstraint('Users', {\n * fields: ['email'],\n * type: 'unique',\n * name: 'custom_unique_constraint_name'\n * });\n *\n * @example \n * queryInterface.addConstraint('Users', {\n * fields: ['roles'],\n * type: 'check',\n * where: {\n * roles: ['user', 'admin', 'moderator', 'guest']\n * }\n * });\n *\n * @example \n * queryInterface.addConstraint('Users', {\n * fields: ['roles'],\n * type: 'default',\n * defaultValue: 'guest'\n * });\n *\n * @example \n * queryInterface.addConstraint('Users', {\n * fields: ['username'],\n * type: 'primary key',\n * name: 'custom_primary_constraint_name'\n * });\n *\n * @example \n * queryInterface.addConstraint('Posts', {\n * fields: ['username'],\n * type: 'foreign key',\n * name: 'custom_fkey_constraint_name',\n * references: { //Required field\n * table: 'target_table_name',\n * field: 'target_column_name'\n * },\n * onDelete: 'cascade',\n * onUpdate: 'cascade'\n * });\n *\n * @example \n * queryInterface.addConstraint('TableName', {\n * fields: ['source_column_name', 'other_source_column_name'],\n * type: 'foreign key',\n * name: 'custom_fkey_constraint_name',\n * references: { //Required field\n * table: 'target_table_name',\n * fields: ['target_column_name', 'other_target_column_name']\n * },\n * onDelete: 'cascade',\n * onUpdate: 'cascade'\n * });\n *\n * @param {string} tableName Table name where you want to add a constraint\n * @param {object} options An object to define the constraint name, type etc\n * @param {string} options.type Type of constraint. One of the values in available constraints(case insensitive)\n * @param {Array} options.fields Array of column names to apply the constraint over\n * @param {string} [options.name] Name of the constraint. If not specified, sequelize automatically creates a named constraint based on constraint type, table & column names\n * @param {string} [options.defaultValue] The value for the default constraint\n * @param {object} [options.where] Where clause/expression for the CHECK constraint\n * @param {object} [options.references] Object specifying target table, column name to create foreign key constraint\n * @param {string} [options.references.table] Target table name\n * @param {string} [options.references.field] Target column name\n * @param {string} [options.references.fields] Target column names for a composite primary key. Must match the order of fields in options.fields.\n * @param {string} [options.deferrable] Sets the constraint to be deferred or immediately checked. See Sequelize.Deferrable. PostgreSQL Only\n *\n * @returns {Promise}\n */\n async addConstraint(tableName, options) {\n if (!options.fields) {\n throw new Error('Fields must be specified through options.fields');\n }\n\n if (!options.type) {\n throw new Error('Constraint type must be specified through options.type');\n }\n\n options = Utils.cloneDeep(options);\n\n const sql = this.queryGenerator.addConstraintQuery(tableName, options);\n return await this.sequelize.query(sql, options);\n }\n\n async showConstraint(tableName, constraintName, options) {\n const sql = this.queryGenerator.showConstraintsQuery(tableName, constraintName);\n return await this.sequelize.query(sql, { ...options, type: QueryTypes.SHOWCONSTRAINTS });\n }\n\n /**\n * Remove a constraint from a table\n *\n * @param {string} tableName Table name to drop constraint from\n * @param {string} constraintName Constraint name\n * @param {object} options Query options\n */\n async removeConstraint(tableName, constraintName, options) {\n return this.sequelize.query(this.queryGenerator.removeConstraintQuery(tableName, constraintName), options);\n }\n\n async insert(instance, tableName, values, options) {\n options = Utils.cloneDeep(options);\n options.hasTrigger = instance && instance.constructor.options.hasTrigger;\n const sql = this.queryGenerator.insertQuery(tableName, values, instance && instance.constructor.rawAttributes, options);\n\n options.type = QueryTypes.INSERT;\n options.instance = instance;\n\n const results = await this.sequelize.query(sql, options);\n if (instance) results[0].isNewRecord = false;\n\n return results;\n }\n\n /**\n * Upsert\n *\n * @param {string} tableName table to upsert on\n * @param {object} insertValues values to be inserted, mapped to field name\n * @param {object} updateValues values to be updated, mapped to field name\n * @param {object} where where conditions, which can be used for UPDATE part when INSERT fails\n * @param {object} options query options\n *\n * @returns {Promise} Resolves an array with \n */\n async upsert(tableName, insertValues, updateValues, where, options) {\n options = { ...options };\n\n const model = options.model;\n\n options.type = QueryTypes.UPSERT;\n options.updateOnDuplicate = Object.keys(updateValues);\n options.upsertKeys = options.conflictFields || [];\n\n if (options.upsertKeys.length === 0) {\n const primaryKeys = Object.values(model.primaryKeys).map(item => item.field);\n const uniqueKeys = Object.values(model.uniqueKeys).filter(c => c.fields.length > 0).map(c => c.fields);\n const indexKeys = Object.values(model._indexes).filter(c => c.unique && c.fields.length > 0).map(c => c.fields);\n // For fields in updateValues, try to find a constraint or unique index\n // that includes given field. Only first matching upsert key is used.\n for (const field of options.updateOnDuplicate) {\n const uniqueKey = uniqueKeys.find(fields => fields.includes(field));\n if (uniqueKey) {\n options.upsertKeys = uniqueKey;\n break;\n }\n\n const indexKey = indexKeys.find(fields => fields.includes(field));\n if (indexKey) {\n options.upsertKeys = indexKey;\n break;\n }\n }\n\n // Always use PK, if no constraint available OR update data contains PK\n if (\n options.upsertKeys.length === 0\n || _.intersection(options.updateOnDuplicate, primaryKeys).length\n ) {\n options.upsertKeys = primaryKeys;\n }\n\n options.upsertKeys = _.uniq(options.upsertKeys);\n }\n\n const sql = this.queryGenerator.insertQuery(tableName, insertValues, model.rawAttributes, options);\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Insert multiple records into a table\n *\n * @example\n * queryInterface.bulkInsert('roles', [{\n * label: 'user',\n * createdAt: new Date(),\n * updatedAt: new Date()\n * }, {\n * label: 'admin',\n * createdAt: new Date(),\n * updatedAt: new Date()\n * }]);\n *\n * @param {string} tableName Table name to insert record to\n * @param {Array} records List of records to insert\n * @param {object} options Various options, please see Model.bulkCreate options\n * @param {object} attributes Various attributes mapped by field name\n *\n * @returns {Promise}\n */\n async bulkInsert(tableName, records, options, attributes) {\n options = { ...options };\n options.type = QueryTypes.INSERT;\n\n const results = await this.sequelize.query(\n this.queryGenerator.bulkInsertQuery(tableName, records, options, attributes),\n options\n );\n\n return results[0];\n }\n\n async update(instance, tableName, values, identifier, options) {\n options = { ...options };\n options.hasTrigger = instance && instance.constructor.options.hasTrigger;\n\n const sql = this.queryGenerator.updateQuery(tableName, values, identifier, options, instance.constructor.rawAttributes);\n\n options.type = QueryTypes.UPDATE;\n\n options.instance = instance;\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Update multiple records of a table\n *\n * @example\n * queryInterface.bulkUpdate('roles', {\n * label: 'admin',\n * }, {\n * userType: 3,\n * },\n * );\n *\n * @param {string} tableName Table name to update\n * @param {object} values Values to be inserted, mapped to field name\n * @param {object} identifier A hash with conditions OR an ID as integer OR a string with conditions\n * @param {object} [options] Various options, please see Model.bulkCreate options\n * @param {object} [attributes] Attributes on return objects if supported by SQL dialect\n *\n * @returns {Promise}\n */\n async bulkUpdate(tableName, values, identifier, options, attributes) {\n options = Utils.cloneDeep(options);\n if (typeof identifier === 'object') identifier = Utils.cloneDeep(identifier);\n\n const sql = this.queryGenerator.updateQuery(tableName, values, identifier, options, attributes);\n const table = _.isObject(tableName) ? tableName : { tableName };\n const model = options.model ? options.model : _.find(this.sequelize.modelManager.models, { tableName: table.tableName });\n\n options.type = QueryTypes.BULKUPDATE;\n options.model = model;\n return await this.sequelize.query(sql, options);\n }\n\n async delete(instance, tableName, identifier, options) {\n const cascades = [];\n const sql = this.queryGenerator.deleteQuery(tableName, identifier, {}, instance.constructor);\n\n options = { ...options };\n\n // Check for a restrict field\n if (!!instance.constructor && !!instance.constructor.associations) {\n const keys = Object.keys(instance.constructor.associations);\n const length = keys.length;\n let association;\n\n for (let i = 0; i < length; i++) {\n association = instance.constructor.associations[keys[i]];\n if (association.options && association.options.onDelete &&\n association.options.onDelete.toLowerCase() === 'cascade' &&\n association.options.useHooks === true) {\n cascades.push(association.accessors.get);\n }\n }\n }\n\n for (const cascade of cascades) {\n let instances = await instance[cascade](options);\n // Check for hasOne relationship with non-existing associate (\"has zero\")\n if (!instances) continue;\n if (!Array.isArray(instances)) instances = [instances];\n for (const _instance of instances) await _instance.destroy(options);\n }\n options.instance = instance;\n return await this.sequelize.query(sql, options);\n }\n\n /**\n * Delete multiple records from a table\n *\n * @param {string} tableName table name from where to delete records\n * @param {object} where where conditions to find records to delete\n * @param {object} [options] options\n * @param {boolean} [options.truncate] Use truncate table command\n * @param {boolean} [options.cascade=false] Only used in conjunction with TRUNCATE. Truncates all tables that have foreign-key references to the named table, or to any tables added to the group due to CASCADE.\n * @param {boolean} [options.restartIdentity=false] Only used in conjunction with TRUNCATE. Automatically restart sequences owned by columns of the truncated table.\n * @param {Model} [model] Model\n *\n * @returns {Promise}\n */\n async bulkDelete(tableName, where, options, model) {\n options = Utils.cloneDeep(options);\n options = _.defaults(options, { limit: null });\n\n if (options.truncate === true) {\n return this.sequelize.query(\n this.queryGenerator.truncateTableQuery(tableName, options),\n options\n );\n }\n\n if (typeof identifier === 'object') where = Utils.cloneDeep(where);\n\n return await this.sequelize.query(\n this.queryGenerator.deleteQuery(tableName, where, options, model),\n options\n );\n }\n\n async select(model, tableName, optionsArg) {\n const options = { ...optionsArg, type: QueryTypes.SELECT, model };\n\n return await this.sequelize.query(\n this.queryGenerator.selectQuery(tableName, options, model),\n options\n );\n }\n\n async increment(model, tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options) {\n options = Utils.cloneDeep(options);\n\n const sql = this.queryGenerator.arithmeticQuery('+', tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options);\n\n options.type = QueryTypes.UPDATE;\n options.model = model;\n\n return await this.sequelize.query(sql, options);\n }\n\n async decrement(model, tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options) {\n options = Utils.cloneDeep(options);\n\n const sql = this.queryGenerator.arithmeticQuery('-', tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options);\n\n options.type = QueryTypes.UPDATE;\n options.model = model;\n\n return await this.sequelize.query(sql, options);\n }\n\n async rawSelect(tableName, options, attributeSelector, Model) {\n options = Utils.cloneDeep(options);\n options = _.defaults(options, {\n raw: true,\n plain: true,\n type: QueryTypes.SELECT\n });\n\n const sql = this.queryGenerator.selectQuery(tableName, options, Model);\n\n if (attributeSelector === undefined) {\n throw new Error('Please pass an attribute selector!');\n }\n\n const data = await this.sequelize.query(sql, options);\n if (!options.plain) {\n return data;\n }\n\n const result = data ? data[attributeSelector] : null;\n\n if (!options || !options.dataType) {\n return result;\n }\n\n const dataType = options.dataType;\n\n if (dataType instanceof DataTypes.DECIMAL || dataType instanceof DataTypes.FLOAT) {\n if (result !== null) {\n return parseFloat(result);\n }\n }\n if (dataType instanceof DataTypes.INTEGER || dataType instanceof DataTypes.BIGINT) {\n if (result !== null) {\n return parseInt(result, 10);\n }\n }\n if (dataType instanceof DataTypes.DATE) {\n if (result !== null && !(result instanceof Date)) {\n return new Date(result);\n }\n }\n return result;\n }\n\n async createTrigger(\n tableName,\n triggerName,\n timingType,\n fireOnArray,\n functionName,\n functionParams,\n optionsArray,\n options\n ) {\n const sql = this.queryGenerator.createTrigger(tableName, triggerName, timingType, fireOnArray, functionName, functionParams, optionsArray);\n options = options || {};\n if (sql) {\n return await this.sequelize.query(sql, options);\n }\n }\n\n async dropTrigger(tableName, triggerName, options) {\n const sql = this.queryGenerator.dropTrigger(tableName, triggerName);\n options = options || {};\n\n if (sql) {\n return await this.sequelize.query(sql, options);\n }\n }\n\n async renameTrigger(tableName, oldTriggerName, newTriggerName, options) {\n const sql = this.queryGenerator.renameTrigger(tableName, oldTriggerName, newTriggerName);\n options = options || {};\n\n if (sql) {\n return await this.sequelize.query(sql, options);\n }\n }\n\n /**\n * Create an SQL function\n *\n * @example\n * queryInterface.createFunction(\n * 'someFunction',\n * [\n * {type: 'integer', name: 'param', direction: 'IN'}\n * ],\n * 'integer',\n * 'plpgsql',\n * 'RETURN param + 1;',\n * [\n * 'IMMUTABLE',\n * 'LEAKPROOF'\n * ],\n * {\n * variables:\n * [\n * {type: 'integer', name: 'myVar', default: 100}\n * ],\n * force: true\n * };\n * );\n *\n * @param {string} functionName Name of SQL function to create\n * @param {Array} params List of parameters declared for SQL function\n * @param {string} returnType SQL type of function returned value\n * @param {string} language The name of the language that the function is implemented in\n * @param {string} body Source code of function\n * @param {Array} optionsArray Extra-options for creation\n * @param {object} [options] query options\n * @param {boolean} options.force If force is true, any existing functions with the same parameters will be replaced. For postgres, this means using `CREATE OR REPLACE FUNCTION` instead of `CREATE FUNCTION`. Default is false\n * @param {Array} options.variables List of declared variables. Each variable should be an object with string fields `type` and `name`, and optionally having a `default` field as well.\n *\n * @returns {Promise}\n */\n async createFunction(functionName, params, returnType, language, body, optionsArray, options) {\n const sql = this.queryGenerator.createFunction(functionName, params, returnType, language, body, optionsArray, options);\n options = options || {};\n\n if (sql) {\n return await this.sequelize.query(sql, options);\n }\n }\n\n /**\n * Drop an SQL function\n *\n * @example\n * queryInterface.dropFunction(\n * 'someFunction',\n * [\n * {type: 'varchar', name: 'param1', direction: 'IN'},\n * {type: 'integer', name: 'param2', direction: 'INOUT'}\n * ]\n * );\n *\n * @param {string} functionName Name of SQL function to drop\n * @param {Array} params List of parameters declared for SQL function\n * @param {object} [options] query options\n *\n * @returns {Promise}\n */\n async dropFunction(functionName, params, options) {\n const sql = this.queryGenerator.dropFunction(functionName, params);\n options = options || {};\n\n if (sql) {\n return await this.sequelize.query(sql, options);\n }\n }\n\n /**\n * Rename an SQL function\n *\n * @example\n * queryInterface.renameFunction(\n * 'fooFunction',\n * [\n * {type: 'varchar', name: 'param1', direction: 'IN'},\n * {type: 'integer', name: 'param2', direction: 'INOUT'}\n * ],\n * 'barFunction'\n * );\n *\n * @param {string} oldFunctionName Current name of function\n * @param {Array} params List of parameters declared for SQL function\n * @param {string} newFunctionName New name of function\n * @param {object} [options] query options\n *\n * @returns {Promise}\n */\n async renameFunction(oldFunctionName, params, newFunctionName, options) {\n const sql = this.queryGenerator.renameFunction(oldFunctionName, params, newFunctionName);\n options = options || {};\n\n if (sql) {\n return await this.sequelize.query(sql, options);\n }\n }\n\n // Helper methods useful for querying\n\n /**\n * @private\n */\n ensureEnums() {\n // noop by default\n }\n\n async setIsolationLevel(transaction, value, options) {\n if (!transaction || !(transaction instanceof Transaction)) {\n throw new Error('Unable to set isolation level for a transaction without transaction object!');\n }\n\n if (transaction.parent || !value) {\n // Not possible to set a separate isolation level for savepoints\n return;\n }\n\n options = { ...options, transaction: transaction.parent || transaction };\n\n const sql = this.queryGenerator.setIsolationLevelQuery(value, {\n parent: transaction.parent\n });\n\n if (!sql) return;\n\n return await this.sequelize.query(sql, options);\n }\n\n async startTransaction(transaction, options) {\n if (!transaction || !(transaction instanceof Transaction)) {\n throw new Error('Unable to start a transaction without transaction object!');\n }\n\n options = { ...options, transaction: transaction.parent || transaction };\n options.transaction.name = transaction.parent ? transaction.name : undefined;\n const sql = this.queryGenerator.startTransactionQuery(transaction);\n\n return await this.sequelize.query(sql, options);\n }\n\n async deferConstraints(transaction, options) {\n options = { ...options, transaction: transaction.parent || transaction };\n\n const sql = this.queryGenerator.deferConstraintsQuery(options);\n\n if (sql) {\n return await this.sequelize.query(sql, options);\n }\n }\n\n async commitTransaction(transaction, options) {\n if (!transaction || !(transaction instanceof Transaction)) {\n throw new Error('Unable to commit a transaction without transaction object!');\n }\n if (transaction.parent) {\n // Savepoints cannot be committed\n return;\n }\n\n options = {\n ...options,\n transaction: transaction.parent || transaction,\n supportsSearchPath: false,\n completesTransaction: true\n };\n\n const sql = this.queryGenerator.commitTransactionQuery(transaction);\n const promise = this.sequelize.query(sql, options);\n\n transaction.finished = 'commit';\n\n return await promise;\n }\n\n async rollbackTransaction(transaction, options) {\n if (!transaction || !(transaction instanceof Transaction)) {\n throw new Error('Unable to rollback a transaction without transaction object!');\n }\n\n options = {\n ...options,\n transaction: transaction.parent || transaction,\n supportsSearchPath: false,\n completesTransaction: true\n };\n options.transaction.name = transaction.parent ? transaction.name : undefined;\n const sql = this.queryGenerator.rollbackTransactionQuery(transaction);\n const promise = this.sequelize.query(sql, options);\n\n transaction.finished = 'rollback';\n\n return await promise;\n }\n}\n\nexports.QueryInterface = QueryInterface;\n"], "mappings": "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", "names": [] }
UNIQUECHECKDefault - MSSQL onlyPrimary KeyForeign KeyComposite Foreign Key