Sequelize — отличная ORM для базы данных. Фреймворк, поддерживает mysql, postgres, sqlite, mariadb, mssql. Метод использования очень гибкий.Количество звезд на GitHub в настоящее время составляет около 20 тысяч.Его периферийный инструмент sequenceize-auto может автоматически генерировать файлы моделей из базы данных, а sequenceize-cli может создавать базы данных на основе файлов моделей, что очень мощно.
Предыдущая статьяОбъясните основное использование Sequelize, в этой статье Sequelize анализируется с точки зрения исходного кода, чтобы каждый мог его использовать четко! !
Ссылка на сайт
- Кодовый адрес этой статьи
- официальная документация
- sequelize
- sequelize-auto
- sequelize-cli
- Пример кода для этой статьи
Возьмите 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()
, andafterDisconnect()
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;
}
Определения полей модели
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
boolean
Sequelize по умолчанию изменит все имена таблиц на множественное число. Если вы не хотите, чтобы они менялись автоматически, вам нужно установить для него значение 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
коммерческое время
Добро пожаловать, обратите внимание, ежедневный прогресс! ! !