各資料庫方言的特定事項
底層連線器函式庫
MySQL
Sequelize 用於 MySQL 的底層連線器函式庫是 mysql2 npm 套件(1.5.2 或更高版本)。
您可以使用 Sequelize 建構函式中的 dialectOptions
提供自訂選項給它
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'mysql',
dialectOptions: {
// Your mysql2 options here
},
});
dialectOptions
會直接傳遞給 MySQL 連線建構函式。完整的選項列表可以在 MySQL 文件中找到。
MariaDB
Sequelize 用於 MariaDB 的底層連線器函式庫是 mariadb npm 套件。
您可以使用 Sequelize 建構函式中的 dialectOptions
提供自訂選項給它
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'mariadb',
dialectOptions: {
// Your mariadb options here
// connectTimeout: 1000
},
});
dialectOptions
會直接傳遞給 MariaDB 連線建構函式。完整的選項列表可以在 MariaDB 文件中找到。
SQLite
Sequelize 用於 SQLite 的底層連線器函式庫是 sqlite3 npm 套件(4.0.0 或以上版本)。
由於 sqlite3@^4 存在安全漏洞,如果無法更新至 sqlite3@^5.0.3,建議使用 @vscode/sqlite3 分支。
您可以使用 storage
選項在 Sequelize 建構函式中指定儲存檔案(使用 :memory:
取得記憶體中的 SQLite 實例)。
您可以使用 Sequelize 建構函式中的 dialectOptions
提供自訂選項給它
import { Sequelize } from 'sequelize';
import SQLite from 'sqlite3';
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'sqlite',
storage: 'path/to/database.sqlite', // or ':memory:'
dialectOptions: {
// Your sqlite3 options here
// for instance, this is how you can configure the database opening mode:
mode: SQLite.OPEN_READWRITE | SQLite.OPEN_CREATE | SQLite.OPEN_FULLMUTEX,
},
});
以下欄位可能會傳遞給 SQLite dialectOptions
mode
:設定 SQLite 連線的開啟模式。潛在值由sqlite3
套件提供,可包括SQLite.OPEN_READONLY
、SQLite.OPEN_READWRITE
或SQLite.OPEN_CREATE
。
如需更多詳細資訊,請參閱 sqlite3 的 API 參考和 SQLite C 介面文件。
PostgreSQL
Sequelize 用於 PostgreSQL 的底層連線器函式庫是 pg 套件(對於 Node 10 和 12,請使用 pg 版本 7.0.0 或更高版本。對於 Node 14 及更高版本,您需要使用 pg 版本 8.2.x 或更高版本,根據 pg 文件)。模組 pg-hstore 也是必要的。
您可以使用 Sequelize 建構函式中的 dialectOptions
提供自訂選項給它
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'postgres',
dialectOptions: {
// Your pg options here
},
});
以下欄位可能會傳遞給 Postgres dialectOptions
application_name
:在 pg_stat_activity 中應用程式的名稱。有關詳細資訊,請參閱 Postgres 文件。ssl
:SSL 選項。有關詳細資訊,請參閱pg
文件。client_encoding
:// 設定 'auto' 會根據用戶端 LC_CTYPE 環境變數來決定地區設定。有關詳細資訊,請參閱 Postgres 文件。keepAlive
:布林值,用於啟用 TCP KeepAlive。有關詳細資訊,請參閱pg
變更日誌。statement_timeout
:在設定的時間(以毫秒為單位)後,查詢逾時。在 pg v7.3 中新增。有關詳細資訊,請參閱 Postgres 文件。idle_in_transaction_session_timeout
:終止任何開啟的交易閒置時間超過指定期間(以毫秒為單位)的工作階段。有關詳細資訊,請參閱 Postgres 文件。
若要透過 Unix 網域 Socket 連線,請在 host
選項中指定 Socket 目錄的路徑。Socket 路徑必須以 /
開頭。
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'postgres',
host: '/path/to/socket_directory',
});
sequelize 中的預設 client_min_messages
設定為 WARNING
。
Redshift
大多數設定與上述 PostgreSQL 相同。
Redshift 不支援 client_min_messages
,需要 'ignore' 來略過設定
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'postgres',
dialectOptions: {
// Your pg options here
// ...
clientMinMessages: 'ignore', // case insensitive
},
});
Microsoft SQL Server (MSSQL)
Sequelize 用於 MSSQL 的底層連線器函式庫是 tedious npm 套件(6.0.0 或以上版本)。
您可以使用 Sequelize 建構函式中的 dialectOptions.options
提供自訂選項給它
const sequelize = new Sequelize('database', 'username', 'password', {
dialect: 'mssql',
dialectOptions: {
// Observe the need for this nested `options` field for MSSQL
options: {
// Your tedious options here
useUTC: false,
dateFirst: 1,
},
},
});
完整的選項列表可以在 tedious 文件中找到。
MSSQL 網域帳戶
若要使用網域帳戶連線,請使用以下格式。
const sequelize = new Sequelize('database', null, null, {
dialect: 'mssql',
dialectOptions: {
authentication: {
type: 'ntlm',
options: {
domain: 'yourDomain',
userName: 'username',
password: 'password',
},
},
options: {
instanceName: 'SQLEXPRESS',
},
},
});
Snowflake(實驗性)
Sequelize 用於 Snowflake 的底層連線器函式庫是 snowflake-sdk npm 套件。
若要使用帳戶連線,請使用以下格式
const sequelize = new Sequelize('database', null, null, {
dialect: 'snowflake',
dialectOptions: {
// put your snowflake account here,
account: 'myAccount', // my-app.us-east-1
// below option should be optional
role: 'myRole',
warehouse: 'myWarehouse',
schema: 'mySchema',
},
// same as other dialect
username: 'myUserName',
password: 'myPassword',
database: 'myDatabaseName',
});
注意 沒有提供測試沙箱,因此 snowflake 整合測試不屬於管道的一部分。核心團隊也很難進行分類和偵錯。此方言目前需要由 snowflake 使用者/社群來維護。
若要執行整合測試
SEQ_ACCOUNT=myAccount SEQ_USER=myUser SEQ_PW=myPassword SEQ_ROLE=myRole SEQ_DB=myDatabaseName SEQ_SCHEMA=mySchema SEQ_WH=myWareHouse npm run test-integration-snowflake
Oracle 資料庫
Sequelize 用於 Oracle 的底層連線器函式庫是 node-oracledb 套件。
請參閱 版本 以查看支援的 Oracle 資料庫和 node-oracledb 版本。
node-oracledb 需要 Oracle Instant Client 才能運作。您可以使用 node-oracledb 快速入門連結進行安裝。
以下是包含與 Oracle 資料庫相關的參數的 Sequelize 建構函式。
const sequelize = new Sequelize('servicename', 'username', 'password', {
dialect: 'oracle',
host: 'hostname',
port: 'port number', //optional
});
Oracle 資料庫的預設連接埠號碼為 1521。
Sequelize 也允許您以 URL 格式傳遞憑證
const sequelize = new Sequelize('oracle://user:pass@hostname:port/servicename');
您可以使用 dialectOptions.connectString
將 Easy Connect String、網路服務名稱或連線描述元傳遞至 Sequelize 建構函式
const sequelize = new Sequelize({
dialect: 'oracle',
username: 'user',
password: 'password',
dialectOptions: {
connectString: 'inst1',
},
});
請注意,database
、host
和 port
將被覆寫,連線字串中的值將用於驗證。
如需有關連線字串的更多資訊,請參閱 連線字串。
資料類型:TIMESTAMP WITHOUT TIME ZONE - 僅限 PostgreSQL
如果您正在使用 PostgreSQL TIMESTAMP WITHOUT TIME ZONE
並且需要將它剖析為不同的時區,請使用 pg 函式庫自己的剖析器
require('pg').types.setTypeParser(1114, stringValue => {
return new Date(stringValue + '+0000');
// e.g., UTC offset. Use any offset that you would like.
});
資料類型:ARRAY(ENUM) - 僅限 PostgreSQL
Array(Enum) 類型需要特殊處理。每當 Sequelize 與資料庫對話時,它都必須使用 ENUM 名稱來轉換陣列值。
因此,此 enum 名稱必須遵循此模式 enum_<table_name>_<col_name>
。如果您使用 sync
,則會自動產生正確的名稱。
資料表提示 - 僅限 MSSQL
可以使用 tableHint
選項來定義資料表提示。此提示必須是 TableHints
中的值,且僅在絕對必要時才應使用。目前每個查詢僅支援單一資料表提示。
資料表提示會透過指定某些選項來覆寫 MSSQL 查詢最佳化工具的預設行為。它們只會影響該子句中參照的資料表或檢視。
const { TableHints } = require('sequelize');
Project.findAll({
// adding the table hint NOLOCK
tableHint: TableHints.NOLOCK,
// this will generate the SQL 'WITH (NOLOCK)'
});
索引提示 - 僅限 MySQL/MariaDB
可以使用 indexHints
選項來定義索引提示。提示類型必須是 IndexHints
中的值,且這些值應參照現有的索引。
索引提示會覆寫 MySQL 查詢最佳化工具的預設行為。
const { IndexHints } = require('sequelize');
Project.findAll({
indexHints: [{ type: IndexHints.USE, values: ['index_project_on_name'] }],
where: {
id: {
[Op.gt]: 623,
},
name: {
[Op.like]: 'Foo %',
},
},
});
以上會產生如下所示的 MySQL 查詢
SELECT * FROM Project USE INDEX (index_project_on_name) WHERE name LIKE 'FOO %' AND id > 623;
Sequelize.IndexHints
包括 USE
、FORCE
和 IGNORE
。
有關原始 API 提案,請參閱 Issue #9421。
引擎 - 僅限 MySQL/MariaDB
模型的預設引擎為 InnoDB。
您可以使用 engine
選項更改模型的引擎(例如,改為 MyISAM)
const Person = sequelize.define(
'person',
{
/* attributes */
},
{
engine: 'MYISAM',
},
);
如同模型定義的每個選項一樣,此設定也可以透過 Sequelize 建構函式的 define
選項全域變更
const sequelize = new Sequelize(db, user, pw, {
define: { engine: 'MYISAM' },
});
資料表註解 - 僅限 MySQL/MariaDB/PostgreSQL
您可以在定義模型時指定資料表的註解
class Person extends Model {}
Person.init(
{
/* attributes */
},
{
comment: "I'm a table comment!",
sequelize,
},
);
當呼叫 sync()
時,將會設定註解。