Практика + анализ исходного кода, чтобы полностью понять Sequelize, с подробными примерами! ! !

Node.js
Практика + анализ исходного кода, чтобы полностью понять Sequelize, с подробными примерами! ! !

Sequelize — отличная ORM для базы данных. Фреймворк, поддерживает mysql, postgres, sqlite, mariadb, mssql. Метод использования очень гибкий.Количество звезд на GitHub в настоящее время составляет около 20 тысяч.Его периферийный инструмент sequenceize-auto может автоматически генерировать файлы моделей из базы данных, а sequenceize-cli может создавать базы данных на основе файлов моделей, что очень мощно.

Предыдущая статьяОбъясните основное использование Sequelize, в этой статье Sequelize анализируется с точки зрения исходного кода, чтобы каждый мог его использовать четко! !

Ссылка на сайт

Возьмите mysql в качестве примера

Подключиться к базе данных

npm i -S sequelize mysql2

Instantiate Sequelize для подключения, параметры настраиваются в конструкторе

const Sequelize = require('sequelize');

// Option 1: Passing parameters separately
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql',
  // 额外的配置...
});

// Option 2: Passing a connection URI
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

Разрешение конструктора Sequelize

Конструктор Sequelize в исходном коде перечисляет часто используемые параметры.

  • database stringИмя базы данных
  • username=null stringимя пользователя
  • password=null stringпароль
  • options={} Objectнастроить
  • options.host='localhost' stringадрес хоста
  • options.port= numberпорт обслуживания базы данных
  • options.username=null stringИмя пользователя, как указано выше
  • options.password=null stringПароль такой же, как и имя пользователя выше, просто введите один из них
  • options.database=null stringимя базы данных, как указано выше
  • options.dialect stringИспользуемый тип базы данных, поддерживаемый в настоящее времяmysql, postgres, sqlite, mssql.
  • timezone='+00:00' stringНастройки часового пояса, часовой пояс Китая по умолчанию необходимо изменить на"+08:00", если используетсяNOWфункция должна обратить внимание. Часовой пояс, используемый при преобразовании даты из базы данных в дату JavaScript. Часовой пояс также используется для УСТАНОВКИ ЧАСОВОГО ПОЯСА при подключении к серверу, чтобы гарантировать, что результат NOW, CURRENT_TIMESTAMP и других функций, связанных со временем, находится в правильном часовом поясе. Для лучшей кросс-платформенной производительности используйте формат +/-ЧЧ:ММ. Также будут приниматься строковые версии часовых поясов, используемые moment.js (например, "Америка/Лос-Анджелес"). Это полезно для регистрации изменений летнего времени.
  • options.logging=console.log Function A function that gets executed every time Sequelize would log something.
  • options.benchmark=false boolean Pass query execution time in milliseconds as second argument to logging function (options.logging).
  • options.replication=false boolean Use read / write replication. To enable replication, pass an object, with two properties, read and write. Write should be an object (a single server for handling writes), and read an array of object (several servers to handle reads). Each read/write server can have the following properties: host, port, username, password, database
  • options.pool ObjectКонфигурация пула соединений
  • options.pool.max=5 numberМаксимальное количество соединений в пуле соединений
  • options.pool.min=0 numberПул соединений минимальное количество соединений
  • options.pool.idle=10000 numberМаксимальное время (в миллисекундах), в течение которого подключение может быть бездействующим, прежде чем оно будет разорвано.
  • options.pool.acquire=60000 numberМаксимальное время в миллисекундах, в течение которого этот пул будет пытаться установить соединение до выдачи ошибки, максимальное время для повторного соединения после ошибки
  • options.pool.evict=1000 numberИнтервал времени в миллисекундах, по истечении которого сиквелиз-пул удалит простаивающие соединения.
  • options.operatorsAliases ObjectПсевдоним оператора на основе строки. Передайте объект, чтобы ограничить набор операторов с псевдонимом. Установите псевдоним оператора.
  • options.hooks ObjectНекоторые функции ловушек для подключения и отключения от базы данных. Объект глобальных функций ловушек, которые вызываются до и после определенных событий жизненного цикла.Глобальные ловушки будут запускаться после любых связанных с моделью ловушек, определенных для того же события (см.Sequelize.Model.init() for a list). Additionally, beforeConnect(), afterConnect(), beforeDisconnect(), and afterDisconnect() hooks may be defined here.

минимальное подключение

// src/db/index.js
const Sequelize = require('sequelize');

const sequelize = new Sequelize('testdb', 'root', 'root', {
  host: 'localhost',
  port: 8889, // 默认是 3306,我的电脑设置的 8889
  dialect: 'mysql',
});

module.exports = sequelize;


// App.js
const seq = require('./src/db');

seq
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });
  
// node App.js

Если соединение установлено успешно, оно будет напечатано следующим образом

модель базы данных

Sequelize должен построить модель, прежде чем он сможет работать с базой данных, слишком громоздко создавать файл модели для каждой таблицы в базе данных. можно использоватьsequelize-autoЭкспортируйте модели прямо из базы данных.

Сначала создайте базу данных testdb, выполните оператор sql, чтобы автоматически создать таблицуtestdb.

Установить сиквелиз-авто

npm i -D sequelize-auto

Автоматически экспортировать модели из базы данных

сиквелизация-автоматическое использование

[node] sequelize-auto -h <host> -d <database> -u <user> -x [password] -p [port]  --dialect [dialect] -c [/path/to/config] -o [/path/to/models] -t [tableName] -C

Options:
  -h, --host        IP/Hostname for the database.   [required]
  -d, --database    Database name.                  [required]
  -u, --user        Username for database.
  -x, --pass        Password for database.
  -p, --port        Port number for database.
  -c, --config      JSON file for Sequelize's constructor "options" flag object as defined here: https://sequelize.readthedocs.org/en/latest/api/sequelize/
  -o, --output      What directory to place the models.
  -e, --dialect     The dialect/engine that you're using: postgres, mysql, sqlite
  -a, --additional  Path to a json file containing model definitions (for all tables) which are to be defined within a model's configuration parameter. For more info: https://sequelize.readthedocs.org/en/latest/docs/models-definition/#configuration
  -t, --tables      Comma-separated names of tables to import
  -T, --skip-tables Comma-separated names of tables to skip
  -C, --camel       Use camel case to name models and fields
  -n, --no-write    Prevent writing the models to disk.
  -s, --schema      Database schema from which to retrieve tables
  -z, --typescript  Output models as typescript with a definitions file.

Простая конфигурация

// package.json
"scripts": {
  "sequelize": "sequelize-auto -o ./src/db/model -d testdb -h localhost -u root -p 8889 -x root -e mysql"
},

Автоматически сгенерированная модель выглядит следующим образом

// src/db/model/blog.js
/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('blog', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    school: {
      type: DataTypes.STRING(255),
      allowNull: true
    },
    name: {
      type: DataTypes.STRING(255),
      allowNull: true
    }
  }, {
    tableName: 'blog',
    timestamps: false,
  });
};


// src/db/model/users.js
/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('users', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    name: {
      type: DataTypes.STRING(30),
      allowNull: true
    },
    age: {
      type: DataTypes.INTEGER(11),
      allowNull: true
    },
    created_at: {
      type: DataTypes.DATE,
      allowNull: true
    },
    updated_at: {
      type: DataTypes.DATE,
      allowNull: true
    }
  }, {
    tableName: 'users',
    timestamps: false,
  });
};

sequelize.defineиmodel.init

в исходном кодеdefineОпределяется следующим образом, на самом делеmodel.init,defineЗадаются три параметраinitсередина.

defineВыше есть это предложение Когда модель определена через define, ее можно передать черезsequelize.models.modelNameдля выполнения операций с базой данных! ! !


  /**
   * Define a new model, representing a table in the database.
   *
   * The table columns are defined by the object that is given as the second argument. Each key of the object represents a column
   *
   * @param {string} modelName The name of the model. The model will be stored in `sequelize.models` under this name
   * @param {Object} attributes An object, where each attribute is a column of the table. See {@link Model.init}
   * @param {Object} [options] These options are merged with the default define options provided to the Sequelize constructor and passed to Model.init()
   *
   * @see
   * {@link Model.init} for a more comprehensive specification of the `options` and `attributes` objects.
   * @see <a href="/manual/tutorial/models-definition.html">Model definition</a> Manual related to model definition
   * @see
   * {@link DataTypes} For a list of possible data types
   *
   * @returns {Model} Newly defined model
   *
   * @example
   * sequelize.define('modelName', {
   *   columnA: {
   *       type: Sequelize.BOOLEAN,
   *       validate: {
   *         is: ["[a-z]",'i'],        // will only allow letters
   *         max: 23,                  // only allow values <= 23
   *         isIn: {
   *           args: [['en', 'zh']],
   *           msg: "Must be English or Chinese"
   *         }
   *       },
   *       field: 'column_a'
   *   },
   *   columnB: Sequelize.STRING,
   *   columnC: 'MY VERY OWN COLUMN TYPE'
   * });
   *
   * sequelize.models.modelName // The model will now be available in models under the name given to define
   */
  define(modelName, attributes, options = {}) {
    options.modelName = modelName;
    options.sequelize = this;

    const model = class extends Model {};

    model.init(attributes, options);

    return model;
  }

Определения полей модели

DataTypes

CHAR

Sequelize.CHAR(100)                   // CHAR(100)
Sequelize.STRING                      // VARCHAR(255)
Sequelize.STRING(1234)                // VARCHAR(1234)
Sequelize.TEXT                        // TEXT
Sequelize.TEXT('tiny')                // TINYTEXT

NUMBER

Sequelize.TINYINT                     // TINYINT
Sequelize.SMALLINT                    // SMALLINT
Sequelize.MEDIUMINT                   // MEDIUMINT
Sequelize.INTEGER                     // INTEGER
Sequelize.BIGINT                      // BIGINT
Sequelize.BIGINT(11)                  // BIGINT(11)

Sequelize.FLOAT                       // FLOAT
Sequelize.FLOAT(11)                   // FLOAT(11)
Sequelize.FLOAT(11, 10)               // FLOAT(11,10)

Sequelize.DOUBLE                      // DOUBLE
Sequelize.DOUBLE(11)                  // DOUBLE(11)
Sequelize.DOUBLE(11, 10)              // DOUBLE(11,10)

Sequelize.DECIMAL                     // DECIMAL
Sequelize.DECIMAL(10, 2)              // DECIMAL(10,2)

TIME

Sequelize.DATE                        // mysql / sqlite 为 DATETIME, postgres 为带时区的 TIMESTAMP
Sequelize.DATE
Sequelize.TIME
Sequelize.DATEONLY                    // DATE 不带时间.

BOOLEAN

Sequelize.BOOLEAN                     // TINYINT(1)

ENUM

Sequelize.ENUM('value 1', 'value 2')  // 一个允许值为'value 1'和'value 2'的ENUM

blob

Sequelize.BLOB                        // BLOB (PostgreSQL 为 bytea)
Sequelize.BLOB('tiny')                // TINYBLOB (PostgreSQL 为 bytea. 其余参数是 medium 和 long)

GEOMETRY

Sequelize.GEOMETRY                    // Spatial 列. 仅 PostgreSQL (带有 PostGIS) 或 MySQL.
Sequelize.GEOMETRY('POINT')           // 带有 geometry 类型的 spatial 列. 仅 PostgreSQL (带有 PostGIS) 或 MySQL.
Sequelize.GEOMETRY('POINT', 4326)     // 具有 geometry 类型和 SRID 的 spatial 列. 仅 PostgreSQL (带有 PostGIS) 或 MySQL.

integer, bigint, floatиdoubleТакже поддерживает атрибуты без знака и нулевого заполнения.

Sequelize.INTEGER.UNSIGNED              // INTEGER UNSIGNED
Sequelize.INTEGER(11).UNSIGNED          // INTEGER(11) UNSIGNED
Sequelize.INTEGER(11).ZEROFILL          // INTEGER(11) ZEROFILL
Sequelize.INTEGER(11).ZEROFILL.UNSIGNED // INTEGER(11) UNSIGNED ZEROFILL
Sequelize.INTEGER(11).UNSIGNED.ZEROFILL // INTEGER(11) UNSIGNED ZEROFILL

исходный кодsequelize/lib/sequelize.jsВ , при экспорте DataTypes в целом, все типы DataTypes также монтируются на Sequelize, поэтому есть следующие два способа использования

const Sequelize, { DataTypes } = require('sequelize')

// ...
created_at: {
  type: Sequelize.DATE,
  allowNull: true
}
// or
created_at: {
  type: DataTypes.DATE,
  allowNull: true
}

Все определения каждого поля следующие

  • type string | DataTypesСтрока или тип данных
  • allowNull=true booleanРазрешить нуль
  • defaultValue=null anyЗначение поля по умолчанию
  • unique=false string | booleanЯвляется ли индекс уникальным. Если это правда, столбец получит уникальное ограничение. Если указана строка, столбец будет частью составного уникального индекса. Если несколько столбцов имеют одинаковую строку, они будут частью одного и того же уникального индекса. показатель
  • primaryKey=false booleanЯвляется ли первичный ключ. Если это правда, этот атрибут будет помечен как первичный ключ.
  • autoIncrement=false booleanАвтоинкремент. Если true, для этого столбца будет установлено автоинкремент
  • comment=null stringКомментарий поля, Комментарий для этого столбца
  • references=null string | Model An object with reference configurations
  • references.model string | Model If this column references another table, provide it here as a Model, or a string
  • references.key='id' string The column of the foreign table that this column references
  • validate Objectпроверка поля, см.валидатор свойства

Конфигурация параметров модели

Модель продолжения требует ручной настройки некоторых параметров.Configuration

Другие распространенные конфигурации следующие

  • timestamp=true booleanОн автоматически добавляется при использовании Sequelize.createdAtиupdatedAtк модели, если в таблице нет этих двух полей, ноtimestamp=true, будет сообщено об ошибке, которую необходимо указать как false в определении модели
  • freezeTableName=false booleanSequelize по умолчанию изменит все имена таблиц на множественное число. Если вы не хотите, чтобы они менялись автоматически, вам нужно установить для него значение true.
  • modelName stringИмя модели, по умолчанию это имя класса, следующий код
  • paranoid=false booleanперечислитьdestroyЗаписи не удалятся, а будут установленыdeletedAtполе является текущей временной меткой, еслиparanoid=true,необходимостьtimestamps=trueбудет следовать этой логике
  • underscored=false``booleanНе используйте правила команды в верблюжьем регистре, которые будут разделены символами подчеркивания,updatedAtИмя поля будетupdated_at
  • tableName stringИмя таблицы,freezeTableName=falseПозволит именам таблиц автоматически программировать множественное число
  • engine stringДвижок таблицы по умолчаниюInnoDB
  • sequelize ObjectПередайте экземпляр продолжения в модель (new Sequelize(xxx)), если не передано, будет сообщено об ошибке
class Bar extends Model {}
Bar.init({ /* bla */ }, {
  // The name of the model. The model will be stored in `sequelize.models` under this name.
  // This defaults to class name i.e. Bar in this case. This will control name of auto-generated
  // foreignKey and association naming
  modelName: 'bar',

  // don't add the timestamp attributes (updatedAt, createdAt)
  timestamps: false,

  // don't delete database entries but set the newly added attribute deletedAt
  // to the current date (when deletion was done). paranoid will only work if
  // timestamps are enabled
  paranoid: true,

  // Will automatically set field option for all attributes to snake cased name.
  // Does not override attribute with field option already defined
  underscored: true,

  // disable the modification of table names; By default, sequelize will automatically
  // transform all passed model names (first parameter of define) into plural.
  // if you don't want that, set the following
  freezeTableName: true,

  // define the table's name
  tableName: 'my_very_custom_table_name',

  // Enable optimistic locking.  When enabled, sequelize will add a version count attribute
  // to the model and throw an OptimisticLockingError error when stale instances are saved.
  // Set to true or a string with the attribute name you want to use to enable.
  version: true,

  // Sequelize instance
  sequelize,
})

Зарегистрируйте модель в экземпляре продолжения

Мы настроили модель ранее, установили соединение для передачи данных и получилиsequelizeФайлы экземпляра и модели, на этом этапе мы используемsequelize.importзарегистрироваться.

Метод импорта кэширует зарегистрированную модель, и повторная регистрация одной и той же модели не будет иметь никакого эффекта. оно можетsequelize-autoЭкспортированный файл модели регистрируется напрямую.

официальная документация

Определение исходного кода, исходный код в основном зависит отif (!this.importCache[importPath]) {Последний заключается в том, чтобы поместить модель вthis.importCacheначальство


Давайте продемонстрируем

на основе экспорта базы данныхusersиblogДве модели, внесите в модель следующие изменения, предотвращающие поведение по умолчанию.

// src/db/model/blog.js
{
  tableName: 'blog',
  timestamps: false,
}

// src/db/model/users.js
{
  tableName: 'users',
  timestamps: false,
}

Изменить index.js

// src/db/index.js
const Sequelize = require('sequelize');
const fs = require('fs');
const path = require('path');
const sequelize = new Sequelize('testdb', 'root', 'root', {
  host: 'localhost',
  port: 8889,
  dialect: 'mysql',
});
// model 目录绝对路径
const modelPath = path.resolve(__dirname, './model');
// 读取所有 model 文件
const files = fs.readdirSync(modelPath);
const db = {};
// 将 model 挂到 db 上
files.forEach(fileName => {
  const modelName = fileName.slice(0, -3);
  db[modelName] = sequelize.import(path.resolve(modelPath, fileName));
});
module.exports = db;

App.js

const db = require('./src/db');
async function init() {
  const users = await db.users.findAll();
  const blog = await db.blog.findAll();
  console.log(JSON.parse(JSON.stringify(users)));
  console.log(JSON.parse(JSON.stringify(blog)));
}
init();

Результаты

Обратите внимание, что нет, наш App.js обычно должен выходить из узла после его выполнения, но здесь узел завершает работу более чем через 10 секунд, потому что простаивающие соединения пула соединений не перезапускаются.

Изменение простоя (время перезапуска соединения бездействия)

Зная приведенный выше метод регистрации продолжения, вы можете легко встроить его в существующую структуру nodejs, смонтировать его в объекте контекста и получить к нему доступ в различных местах.

операции с базой данных

Как работать

Метод работы модели

увеличивать

create

Создайте запись и верните эту запись базы данных

public static create(values: Object, options: Object): Promise<Model>

src/db/model/users.js изменить следующим образом

created_at: {
  type: DataTypes.DATE,
  allowNull: true,
  defaultValue: sequelize.fn('NOW') // 填充默认时间为现在
},
updated_at: {
  type: DataTypes.DATE,
  allowNull: true,
  defaultValue: sequelize.fn('NOW') // 填充默认时间为现在
}
// App.js
const users = await db.users.create({
  name: 'lxfriday',
  age: 33,
});
console.log(JSON.parse(JSON.stringify(users)));

вернуть запись после вставки

Обратите внимание на проблему с часовым поясом при подключении к базе данных в начале этой статьи.options.timezoneустановить как+08:00можно изменить на китайское время.

bulkCreate

Создает несколько записей и возвращает массив объектов, каждый объект является записью

public static bulkCreate(records: Array, options: Object): Promise<Array<Model>>
const users = await db.users.bulkCreate([
    {
      name: 'lxfriday1',
      age: 111,
    },
    {
      name: 'lxfriday2',
      age: 222,
    },
    {
      name: 'lxfriday3',
      age: 338,
    },
  ]);

findOrCreate

Сначала найдите, если не нашли, создайте исходя из условий

public static findOrCreate(options: Object): Promise<Model, boolean>

const users = await db.users.findOrCreate({
  where: {
    name: 'lxfridaysss',
    age: 3399,
  },
});
const users2 = await db.users.findOrCreate({
  where: {
    name: 'lxfridaywww',
  },
  defaults: {
    age: 3399,
  }
});
// 会自动合并成{name,age}

Если он не найден, он автоматически объединится где и по умолчанию в качестве нового источника данных.

чек

findAll

Запросить все по условию

public static findAll(options: Object): Promise<Array<Model>>

В основном обратите внимание на условия запроса и поля запроса, операторы изSequelize.Opэкспорт.

  • where ObjectУсловия запроса
  • attributes Array<string> | Objectполе запроса
  • attributes.include Array<string>Поля для включения, такие же, как и непосредственное предоставлениеattributesназначать
  • attributes.exclude Array<string>поля не включать
  • order Array | fn | col | literalСортировать,[['id', 'DESC'], 'age']
['age', 'DESC'],
// ['id', 'ASC'],
'id',// 同上
  • limit numberОграничить количество запросов
  • offset numberКомпенсировать

![](https://user-gold-cdn.xitu.io/2019/7/28/16c3936efb0f7f3e?w=548&h=501&f=png&s=62216)
await db.users.findAll({
  where: {
    attr1: 42,
    attr2: 'cake'
  }
})
//  WHERE attr1 = 42 AND attr2 = 'cake'
const users = await db.users.findAll({
    attributes: {
      exclude: ['name']
    },
    where: {
      name: {
        [like]: '%lxfriday%',
      },
    },
    order: [
      ['age', 'DESC'],
      ['id', 'ASC'],
      // 'id',
    ],
  });

выполнить оператор и результат

const {gt, lte, ne, in: opIn} = Sequelize.Op;

await db.users.findAll({
  where: {
    attr1: {
      [gt]: 50
    },
    attr2: {
      [lte]: 45
    },
    attr3: {
      [opIn]: [1,2,3]
    },
    attr4: {
      [ne]: 5
    }
  }
})

// WHERE attr1 > 50 AND attr2 <= 45 AND attr3 IN (1,2,3) AND attr4 != 5
const {or, and, gt, lt} = Sequelize.Op;

await db.users.findAll({
  where: {
    name: 'a project',
    [or]: [
      {id: [1, 2, 3]},
      {
        [and]: [
          {id: {[gt]: 10}},
          {id: {[lt]: 100}}
        ]
      }
    ]
  }
});

// WHERE `Model`.`name` = 'a project' AND (`Model`.`id` IN (1, 2, 3) OR (`Model`.`id` > 10 AND `Model`.`id` < 100));
findOne

найти, даfindAll({limit: 1, ...})версия, см. конфигурациюfindAll

public static findOne(options: Object): Promise<Model>

findByPk
public static findByPk(param: number | string | Buffer, options: Object): Promise<Model>

Запрос по первичному ключу, первичный ключ может быть любым полем и типом, первичным ключом может быть не только id

blog_urlэто первичный ключ

findAndCountAll

Найдите и подсчитайте количество результатов

public static findAndCountAll(options: Object): Promise<{count: number, rows: Model[]}>

изменять

update

изменить данные

public static update(values: Object, options: Object): Promise<Array<number, number>>

Возвращает массив, параметр массива - количество измененных баров

upsert

Обновите, создайте запись, если она не существует

public static upsert(values: Object, options: Object): Promise<boolean>

Удалить

public static destroy(options: Object): Promise<number>

статистика

count
public static count(options: Object): Promise<number>
мин, макс, сумма

поле поле для запроса

public static min(field: string, options: Object): Promise<*>

Совокупный запрос

aggregate
public static aggregate(attribute: string, aggregateFunction: string, options: Object): Promise<DataTypes|Object>

оператор

отsequelize.Opэкспорт,

const Op = Sequelize.Op

[Op.and]: {a: 5}           // 且 (a = 5)
[Op.or]: [{a: 5}, {a: 6}]  // (a = 5 或 a = 6)
[Op.gt]: 6,                // id > 6
[Op.gte]: 6,               // id >= 6
[Op.lt]: 10,               // id < 10
[Op.lte]: 10,              // id <= 10
[Op.ne]: 20,               // id != 20
[Op.eq]: 3,                // = 3
[Op.not]: true,            // 不是 TRUE
[Op.between]: [6, 10],     // 在 6 和 10 之间
[Op.notBetween]: [11, 15], // 不在 11 和 15 之间
[Op.in]: [1, 2],           // 在 [1, 2] 之中
[Op.notIn]: [1, 2],        // 不在 [1, 2] 之中
[Op.like]: '%hat',         // 包含 '%hat'
[Op.notLike]: '%hat'       // 不包含 '%hat'
[Op.iLike]: '%hat'         // 包含 '%hat' (不区分大小写)  (仅限 PG)
[Op.notILike]: '%hat'      // 不包含 '%hat'  (仅限 PG)
[Op.startsWith]: 'hat'     // 类似 'hat%'
[Op.endsWith]: 'hat'       // 类似 '%hat'
[Op.substring]: 'hat'      // 类似 '%hat%'
[Op.regexp]: '^[h|a|t]'    // 匹配正则表达式/~ '^[h|a|t]' (仅限 MySQL/PG)
[Op.notRegexp]: '^[h|a|t]' // 不匹配正则表达式/!~ '^[h|a|t]' (仅限 MySQL/PG)
[Op.iRegexp]: '^[h|a|t]'    // ~* '^[h|a|t]' (仅限 PG)
[Op.notIRegexp]: '^[h|a|t]' // !~* '^[h|a|t]' (仅限 PG)
[Op.like]: { [Op.any]: ['cat', 'hat']} // 包含任何数组['cat', 'hat'] - 同样适用于 iLike 和 notLike
[Op.overlap]: [1, 2]       // && [1, 2] (PG数组重叠运算符)
[Op.contains]: [1, 2]      // @> [1, 2] (PG数组包含运算符)
[Op.contained]: [1, 2]     // <@ [1, 2] (PG数组包含于运算符)
[Op.any]: [2,3]            // 任何数组[2, 3]::INTEGER (仅限PG)

[Op.col]: 'user.organization_id' // = 'user'.'organization_id', 使用数据库语言特定的列标识符, 本例使用 PG

коммерческое время

Добро пожаловать, обратите внимание, ежедневный прогресс! ! !