その他のデータ型
「モデルの基礎」ガイドで言及されている最も一般的なデータ型以外にも、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));
BLOB
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を取得すると、常にバッファとして取得されます。
ENUM
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は DataTypes.JSONB
というJSONBデータ型もサポートしています。これは3つの異なる方法でクエリできます
// 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 Database |
---|---|---|---|---|---|---|---|---|---|
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 パッケージをインストールする必要があります。