其他資料類型
除了模型基礎指南中提到最常見的資料類型外,Sequelize 還提供了其他幾種資料類型。
範圍 (僅限 PostgreSQL)
DataTypes.RANGE(DataTypes.INTEGER); // int4range
DataTypes.RANGE(DataTypes.BIGINT); // int8range
DataTypes.RANGE(DataTypes.DATE); // tstzrange
DataTypes.RANGE(DataTypes.DATEONLY); // daterange
DataTypes.RANGE(DataTypes.DECIMAL); // numrange
由於範圍類型對於其邊界包含/排除具有額外資訊,因此僅使用元組在 javascript 中表示它們並不是很直接。
當以值形式提供範圍時,您可以從以下 API 中選擇
// defaults to inclusive lower bound, exclusive upper bound
const range = [new Date(Date.UTC(2016, 0, 1)), new Date(Date.UTC(2016, 1, 1))];
// '["2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'
// control inclusion
const range = [
{ value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
{ value: new Date(Date.UTC(2016, 1, 1)), inclusive: true },
];
// '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"]'
// composite form
const range = [
{ value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
new Date(Date.UTC(2016, 1, 1)),
];
// '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'
const Timeline = sequelize.define('Timeline', {
range: DataTypes.RANGE(DataTypes.DATE),
});
await Timeline.create({ range });
但是,檢索到的範圍值始終以物件陣列的形式出現。 例如,如果存儲的值是("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"]
,在尋找器查詢之後,您將得到
[
{ value: Date, inclusive: false },
{ value: Date, inclusive: true },
];
在使用範圍類型更新實例後,您需要呼叫reload()
或使用returning: true
選項。
特殊情況
// empty range:
Timeline.create({ range: [] }); // range = 'empty'
// Unbounded range:
Timeline.create({ range: [null, null] }); // range = '[,)'
// range = '[,"2016-01-01 00:00:00+00:00")'
Timeline.create({ range: [null, new Date(Date.UTC(2016, 0, 1))] });
// Infinite range:
// range = '[-infinity,"2016-01-01 00:00:00+00:00")'
Timeline.create({ range: [-Infinity, new Date(Date.UTC(2016, 0, 1))] });
網路位址
陣列 (僅限 PostgreSQL)
// Defines an array of DataTypes.SOMETHING.
DataTypes.ARRAY(/* DataTypes.SOMETHING */);
// For example
// VARCHAR(255)[]
DataTypes.ARRAY(DataTypes.STRING);
// VARCHAR(255)[][]
DataTypes.ARRAY(DataTypes.ARRAY(DataTypes.STRING));
BLOBs
DataTypes.BLOB; // BLOB (bytea for PostgreSQL)
DataTypes.BLOB('tiny'); // TINYBLOB (bytea for PostgreSQL)
DataTypes.BLOB('medium'); // MEDIUMBLOB (bytea for PostgreSQL)
DataTypes.BLOB('long'); // LONGBLOB (bytea for PostgreSQL)
blob 資料類型允許您將資料插入為字串和緩衝區。 但是,當使用 Sequelize 從資料庫檢索 blob 時,它始終會以緩衝區的形式檢索。
ENUMs
ENUM 是一種資料類型,它只接受幾個值,這些值指定為一個列表。
DataTypes.ENUM('foo', 'bar'); // An ENUM with allowed values 'foo' and 'bar'
ENUM 也可以使用欄位定義的 values
欄位來指定,如下所示
sequelize.define('foo', {
states: {
type: DataTypes.ENUM,
values: ['active', 'pending', 'deleted'],
},
});
JSON (僅限 SQLite、MySQL、MariaDB、Oracle 和 PostgreSQL)
DataTypes.JSON
資料類型僅支援 SQLite、MySQL、MariaDB、Oracle 和 PostgreSQL。 但是,MSSQL 有最低限度的支援 (見下文)。
PostgreSQL 注意事項
PostgreSQL 中的 JSON 資料類型將值儲存為純文字,而不是二進位表示。 如果您只想儲存和檢索 JSON 表示,使用 JSON 會佔用較少的磁碟空間,並且從其輸入表示建置所需的時間也較少。 但是,如果您想對 JSON 值執行任何操作,您應該偏好下面描述的 JSONB 資料類型。
JSONB (僅限 PostgreSQL)
PostgreSQL 也支援 JSONB 資料類型:DataTypes.JSONB
。 可以透過三種不同的方式查詢它
// Nested object
await Foo.findOne({
where: {
meta: {
video: {
url: {
[Op.ne]: null,
},
},
},
},
});
// Nested key
await Foo.findOne({
where: {
'meta.audio.length': {
[Op.gt]: 20,
},
},
});
// Containment
await Foo.findOne({
where: {
meta: {
[Op.contains]: {
site: {
url: 'https://google.com',
},
},
},
},
});
MSSQL
MSSQL 沒有 JSON 資料類型,但自 SQL Server 2016 以來,它確實透過某些函數提供對儲存為字串的 JSON 的一些支援。 使用這些函數,您將能夠查詢儲存在字串中的 JSON,但任何傳回的值都需要單獨解析。
// ISJSON - to test if a string contains valid JSON
await User.findAll({
where: sequelize.where(sequelize.fn('ISJSON', sequelize.col('userDetails')), 1),
});
// JSON_VALUE - extract a scalar value from a JSON string
await User.findAll({
attributes: [
[sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'), 'address line 1'],
],
});
// JSON_VALUE - query a scalar value from a JSON string
await User.findAll({
where: sequelize.where(
sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'),
'14, Foo Street',
),
});
// JSON_QUERY - extract an object or array
await User.findAll({
attributes: [
[sequelize.fn('JSON_QUERY', sequelize.col('userDetails'), '$.address'), 'full address'],
],
});
雜項資料類型
Sequelize 資料類型 | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi | Oracle 資料庫 |
---|---|---|---|---|---|---|---|---|---|
GEOMETRY | GEOMETRY | GEOMETRY | GEOMETRY | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POINT') | GEOMETRY(POINT) | POINT | POINT | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POINT', 4326) | GEOMETRY(POINT,4326) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POLYGON') | GEOMETRY(POLYGON) | POLYGON | POLYGON | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('LINESTRING') | GEOMETRY(LINESTRING) | LINESTRING | LINESTRING | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOGRAPHY | GEOGRAPHY | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
HSTORE | HSTORE | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
在 Postgres 中,GEOMETRY 和 GEOGRAPHY 類型由 PostGIS 擴充實作。
在 Postgres 中,如果您使用 DataTypes.HSTORE
,則必須安裝 pg-hstore 套件