Django モデルフィールド：データベースフィールド 型対応表

#この記事について
Djangoでデータベースマイグレーションを実行した時、モデルフィールドがデータベース上のどの型に対応付けられるのかを調査
環境：Django2.0 Postgres9.6 MySQL5.7
Oracleは環境が無いので除外


SQLServerは最近のDjangoバージョンに対応してないので除外

パッケージ「django-pyodbc-azure」を利用することでSQLServerにも接続可能です。環境 SQL Server 2017で確認。


# 参考
モデルフィールドについては以下の記事を参照

[Django: モデルフィールドリファレンスの一覧]
(https://qiita.com/nachashin/items/f768f0d437e0042dd4b3)

# 元のモデルクラス

```py3:model.py
from django.db import models

# Create your models here.


class Foreign(models.Model):
    pass


class ManyToMany(models.Model):
    pass


class OneToOne(models.Model):
    pass


class Sample(models.Model):

    # 文字列型
    CharField = models.CharField(max_length=100)
    SlugField = models.SlugField()
    URLField = models.URLField()
    EmailField = models.EmailField()
    UUIDField = models.UUIDField()
    FilePathField = models.FilePathField()
    GenericIPAddressField = models.GenericIPAddressField()
    TextField = models.TextField()
    # 数値型
    IntegerField = models.IntegerField()
    SmallIntegerField = models.SmallIntegerField()
    BigIntegerField = models.BigIntegerField()
    PositiveIntegerField = models.PositiveIntegerField()
    PositiveSmallIntegerField = models.PositiveSmallIntegerField()
    FloatField = models.FloatField()
    DecimalField = models.DecimalField(max_digits=5, decimal_places=2)
    # 論理型
    BooleanField = models.BooleanField(default=True)
    NullBooleanField = models.NullBooleanField()
    # 時間型
    TimeField = models.TimeField()
    DateField = models.DateField()
    DateTimeField = models.DateTimeField()
    DurationField = models.DurationField()
    # バイナリ型
    BinaryField = models.BinaryField()
    # ストレージ連動型
    FileField = models.FileField()
    ImageField = models.ImageField()
    # リレーション
    ForeignKey = models.ForeignKey(Foreign, on_delete=models.CASCADE)
    OneToOneField = models.OneToOneField(OneToOne, on_delete=models.CASCADE)
    ManyToManyField = models.ManyToManyField(ManyToMany)

```

#PostgreSQL
## 対応表

|ModelField|DatabaseField|NOTNULL|CONSTRAINT|INDEX|
|:--:|:--:|:--:|:--:|:--:|
|id|serial|NOT NULL|PRIMARY KEY|○|
|CharField|varchar|NOT NULL||
|SlugField|varchar(50) |NOT NULL||○|
|URLField|varchar(200) |NOT NULL||
|EmailField|varchar(254) |NOT NULL||
|UUIDField|uuid|NOT NULL||
|FilePathField|varchar(100) |NOT NULL||
|GenericIPAddressField|inet|NOT NULL||
|TextField|text|NOT NULL||
|IntegerField|integer|NOT NULL||
|SmallIntegerField|smallint|NOT NULL||
|BigIntegerField|bigint|NOT NULL||
|PositiveIntegerField|integer|NOT NULL|CHECK ( >= 0)|
|PositiveSmallIntegerField|smallint|NOT NULL|CHECK ( >= 0)|
|FloatField|double precision|NOT NULL||
|DecimalField|numeric|NOT NULL||
|BooleanField|boolean|NOT NULL||
|NullBooleanField|boolean|NULL||
|TimeField|time|NOT NULL||
|DateField|date|NOT NULL||
|DateTimeField|timestamp with time zone |NOT NULL||
|DurationField|interval|NOT NULL||
|BinaryField|bytea|NOT NULL||
|FileField|varchar(100)|NOT NULL||
|ImageField|varchar(100) |NOT NULL||
|ForeignKey_id|integer|NOT NULL||○|
|OneToOneField_id|integer|NOT NULL|UNIQUE|○|

## SQL(PostgreSQL)

```sql:
BEGIN; 

--
-- Create model Foreign
--
CREATE TABLE "myapp_foreign" ("id" serial NOT NULL PRIMARY KEY); 

--
-- Create model ManyToMany
--
CREATE TABLE "myapp_manytomany" ("id" serial NOT NULL PRIMARY KEY); 

--
-- Create model OneToOne
--
CREATE TABLE "myapp_onetoone" ("id" serial NOT NULL PRIMARY KEY); 

--
-- Create model Sample
--
CREATE TABLE "myapp_sample" ( 
  "id" serial NOT NULL PRIMARY KEY
  , "CharField" varchar (100) NOT NULL
  , "SlugField" varchar (50) NOT NULL
  , "URLField" varchar (200) NOT NULL
  , "EmailField" varchar (254) NOT NULL
  , "UUIDField" uuid NOT NULL
  , "FilePathField" varchar (100) NOT NULL
  , "GenericIPAddressField" inet NOT NULL
  , "TextField" text NOT NULL
  , "IntegerField" integer NOT NULL
  , "SmallIntegerField" smallint NOT NULL
  , "BigIntegerField" bigint NOT NULL
  , "PositiveIntegerField" integer NOT NULL CHECK ("PositiveIntegerField" >= 0)
  , "PositiveSmallIntegerField" smallint NOT NULL CHECK ("PositiveSmallIntegerField" >= 0)
  , "FloatField" double precision NOT NULL
  , "DecimalField" numeric (5, 2) NOT NULL
  , "BooleanField" boolean NOT NULL
  , "NullBooleanField" boolean NULL
  , "TimeField" time NOT NULL
  , "DateField" date NOT NULL
  , "DateTimeField" timestamp with time zone NOT NULL
  , "DurationField" interval NOT NULL
  , "BinaryField" bytea NOT NULL
  , "FileField" varchar (100) NOT NULL
  , "ImageField" varchar (100) NOT NULL
  , "ForeignKey_id" integer NOT NULL
  , "OneToOneField_id" integer NOT NULL UNIQUE
); 

CREATE TABLE "myapp_sample_ManyToManyField" ( 
  "id" serial NOT NULL PRIMARY KEY
  , "sample_id" integer NOT NULL
  , "manytomany_id" integer NOT NULL
); 

ALTER TABLE "myapp_sample" ADD CONSTRAINT "myapp_sample_ForeignKey_id_09008ff8_fk_myapp_foreign_id" 
FOREIGN KEY ("ForeignKey_id") REFERENCES "myapp_foreign" ("id") DEFERRABLE INITIALLY DEFERRED; 

ALTER TABLE "myapp_sample" ADD CONSTRAINT "myapp_sample_OneToOneField_id_9e8cdf39_fk_myapp_onetoone_id"
 FOREIGN KEY ("OneToOneField_id") REFERENCES "myapp_onetoone" ("id") DEFERRABLE INITIALLY DEFERRED; 

CREATE INDEX "myapp_sample_SlugField_4b3b6bbf" 
  ON "myapp_sample" ("SlugField"); 

CREATE INDEX "myapp_sample_SlugField_4b3b6bbf_like" 
  ON "myapp_sample" ("SlugField" varchar_pattern_ops); 

CREATE INDEX "myapp_sample_ForeignKey_id_09008ff8" 
  ON "myapp_sample" ("ForeignKey_id"); 

ALTER TABLE "myapp_sample_ManyToManyField" ADD CONSTRAINT "myapp_sample_ManyToM_sample_id_379d0abf_fk_myapp_sam"
 FOREIGN KEY ("sample_id") REFERENCES "myapp_sample" ("id") DEFERRABLE INITIALLY DEFERRED; 

ALTER TABLE "myapp_sample_ManyToManyField" ADD CONSTRAINT "myapp_sample_ManyToM_manytomany_id_2d47e8ad_fk_myapp_man"
 FOREIGN KEY ("manytomany_id") REFERENCES "myapp_manytomany" ("id") DEFERRABLE INITIALLY DEFERRED; 

ALTER TABLE "myapp_sample_ManyToManyField" ADD CONSTRAINT myapp_sample_ManyToManyF_sample_id_manytomany_id_cd20a596_uniq
 UNIQUE ("sample_id", "manytomany_id"); 

CREATE INDEX "myapp_sample_ManyToManyField_sample_id_379d0abf" 
  ON "myapp_sample_ManyToManyField" ("sample_id"); 

CREATE INDEX "myapp_sample_ManyToManyField_manytomany_id_2d47e8ad" 
  ON "myapp_sample_ManyToManyField" ("manytomany_id"); 

COMMIT; 

```

#MySQL
##対応表

|ModelField|DatabaseField|NOTNULL|CONSTRAINT|INDEX|
|:--:|:--:|:--:|:--:|:--:|
|id|integer|NOT NULL|AUTO_INCREMENT, PRIMARY KEY|○|
|CharField|varchar|NOT NULL||
|SlugField|varchar(50)|NOT NULL||○|
|URLField|varchar(200)|NOT NULL||
|EmailField|varchar(254)|NOT NULL||
|UUIDField|char(32)|NOT NULL||
|FilePathField|varchar(100)|NOT NULL||
|GenericIPAddressField|char(39)|NOT NULL||
|TextField|longtext|NOT NULL||
|IntegerField|integer|NOT NULL||
|SmallIntegerField|smallint|NOT NULL||
|BigIntegerField|bigint|NOT NULL||
|PositiveIntegerField|integer|NOT NULL|UNSIGNED |
|PositiveSmallIntegerField|smallint|NOT NULL|UNSIGNED |
|FloatField|double precision |NOT NULL||
|DecimalField|numeric|NOT NULL||
|BooleanField|bool|NOT NULL||
|NullBooleanField|bool|NULL||
|TimeField|time(6) |NOT NULL||
|DateField|date|NOT NULL||
|DateTimeField|datetime(6)|NOT NULL||
|DurationField|bigint|NOT NULL||
|BinaryField|longblob|NOT NULL||
|FileField|varchar(100) |NOT NULL||
|ImageField|varchar(100) |NOT NULL||
|ForeignKey_id|integer|NOT NULL||○|
|OneToOneField_id|integer|NOT NULL|UNIQUE|○|

## SQL(MySQL)

```sql:

BEGIN; 

--
-- Create model Foreign
--
CREATE TABLE `myapp_foreign` ( 
  `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
); 

--
-- Create model ManyToMany
--
CREATE TABLE `myapp_manytomany` ( 
  `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
); 

--
-- Create model OneToOne
--
CREATE TABLE `myapp_onetoone` ( 
  `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
); 

--
-- Create model Sample
--
CREATE TABLE `myapp_sample` ( 
  `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
  , `CharField` varchar (100) NOT NULL
  , `SlugField` varchar (50) NOT NULL
  , `URLField` varchar (200) NOT NULL
  , `EmailField` varchar (254) NOT NULL
  , `UUIDField` char (32) NOT NULL
  , `FilePathField` varchar (100) NOT NULL
  , `GenericIPAddressField` char (39) NOT NULL
  , `TextField` longtext NOT NULL
  , `IntegerField` integer NOT NULL
  , `SmallIntegerField` smallint NOT NULL
  , `BigIntegerField` bigint NOT NULL
  , `PositiveIntegerField` integer UNSIGNED NOT NULL
  , `PositiveSmallIntegerField` smallint UNSIGNED NOT NULL
  , `FloatField` double precision NOT NULL
  , `DecimalField` numeric (5, 2) NOT NULL
  , `BooleanField` bool NOT NULL
  , `NullBooleanField` bool NULL
  , `TimeField` time (6) NOT NULL
  , `DateField` date NOT NULL
  , `DateTimeField` datetime(6) NOT NULL
  , `DurationField` bigint NOT NULL
  , `BinaryField` longblob NOT NULL
  , `FileField` varchar (100) NOT NULL
  , `ImageField` varchar (100) NOT NULL
  , `ForeignKey_id` integer NOT NULL
  , `OneToOneField_id` integer NOT NULL UNIQUE
); 

CREATE TABLE `myapp_sample_ManyToManyField` ( 
  `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY
  , `sample_id` integer NOT NULL
  , `manytomany_id` integer NOT NULL
); 

ALTER TABLE `myapp_sample` ADD CONSTRAINT `myapp_sample_ForeignKey_id_09008ff8_fk_myapp_foreign_id` 
FOREIGN KEY (`ForeignKey_id`) REFERENCES `myapp_foreign` (`id`); 

ALTER TABLE `myapp_sample` ADD CONSTRAINT `myapp_sample_OneToOneField_id_9e8cdf39_fk_myapp_onetoone_id`
 FOREIGN KEY (`OneToOneField_id`) REFERENCES `myapp_onetoone` (`id`); 

CREATE INDEX `myapp_sample_SlugField_4b3b6bbf` 
  ON `myapp_sample` (`SlugField`); 

ALTER TABLE `myapp_sample_ManyToManyField` ADD CONSTRAINT `myapp_sample_ManyToM_sample_id_379d0abf_fk_myapp_sam`
 FOREIGN KEY (`sample_id`) REFERENCES `myapp_sample` (`id`); 

ALTER TABLE `myapp_sample_ManyToManyField` ADD CONSTRAINT `myapp_sample_ManyToM_manytomany_id_2d47e8ad_fk_myapp_man`
 FOREIGN KEY (`manytomany_id`) REFERENCES `myapp_manytomany` (`id`); 

ALTER TABLE `myapp_sample_ManyToManyField` ADD CONSTRAINT myapp_sample_ManyToManyF_sample_id_manytomany_id_cd20a596_uniq
 UNIQUE (`sample_id`, `manytomany_id`); 

COMMIT; 

```

# SQLite3
## 対応表

|ModelField|DatabaseField|NOTNULL|CONSTRAINT|INDEX|
|:--:|:--:|:--:|:--:|:--:|
id|integer|NOT NULL |PRIMARY KEY AUTOINCREMENT|○|
CharField|varchar |NOT NULL||
SlugField|varchar(50) |NOT NULL||○|
URLField|varchar(200) |NOT NULL||
EmailField|varchar(254) |NOT NULL||
UUIDField|char(32) |NOT NULL||
FilePathField|varchar(100) |NOT NULL||
GenericIPAddressField|char(39)|NOT NULL||
TextField|text|NOT NULL||
IntegerField|integer|NOT NULL||
SmallIntegerField|smallint|NOT NULL||
BigIntegerField|bigint|NOT NULL||
PositiveIntegerField|integer unsigned |NOT NULL||
PositiveSmallIntegerField|smallint unsigned |NOT NULL||
FloatField|real|NOT NULL||
DecimalField|decimal|NOT NULL||
BooleanField|bool|NOT NULL||
NullBooleanField|bool|NULL||
TimeField|time|NOT NULL||
DateField|date|NOT NULL||
DateTimeField|datetime|NOT NULL||
DurationField|bigint|NOT NULL||
BinaryField|BLOB|NOT NULL||
FileField|varchar(100) |NOT NULL||
ImageField|varchar(100) |NOT NULL||
ForeignKey_id|integer|NOT NULL |REFERENCES |○|
OneToOneField_id|integer|NOT NULL |UNIQUE REFERENCES |○|

## SQL(SQLite3)

```sql:

BEGIN; 

--
-- Create model Foreign
--
CREATE TABLE "myapp_foreign" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT); 

--
-- Create model ManyToMany
--
CREATE TABLE "myapp_manytomany" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT); 

--
-- Create model OneToOne
--
CREATE TABLE "myapp_onetoone" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT); 

--
-- Create model Sample
--
CREATE TABLE "myapp_sample" ( 
  "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT
  , "CharField" varchar (100) NOT NULL
  , "SlugField" varchar (50) NOT NULL
  , "URLField" varchar (200) NOT NULL
  , "EmailField" varchar (254) NOT NULL
  , "UUIDField" char (32) NOT NULL
  , "FilePathField" varchar (100) NOT NULL
  , "GenericIPAddressField" char (39) NOT NULL
  , "TextField" text NOT NULL
  , "IntegerField" integer NOT NULL
  , "SmallIntegerField" smallint NOT NULL
  , "BigIntegerField" bigint NOT NULL
  , "PositiveIntegerField" integer unsigned NOT NULL
  , "PositiveSmallIntegerField" smallint unsigned NOT NULL
  , "FloatField" real NOT NULL
  , "DecimalField" decimal NOT NULL
  , "BooleanField" bool NOT NULL
  , "NullBooleanField" bool NULL
  , "TimeField" time NOT NULL
  , "DateField" date NOT NULL
  , "DateTimeField" datetime NOT NULL
  , "DurationField" bigint NOT NULL
  , "BinaryField" BLOB NOT NULL
  , "FileField" varchar (100) NOT NULL
  , "ImageField" varchar (100) NOT NULL
  , "ForeignKey_id" integer NOT NULL REFERENCES "myapp_foreign" ("id") DEFERRABLE INITIALLY DEFERRED
  , "OneToOneField_id" integer NOT NULL UNIQUE REFERENCES "myapp_onetoone" ("id") DEFERRABLE INITIALLY
   DEFERRED
); 

CREATE TABLE "myapp_sample_ManyToManyField" ( 
  "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT
  , "sample_id" integer NOT NULL REFERENCES "myapp_sample" ("id") DEFERRABLE INITIALLY DEFERRED
  , "manytomany_id" integer NOT NULL REFERENCES "myapp_manytomany" ("id") DEFERRABLE INITIALLY DEFERRED
); 

CREATE INDEX "myapp_sample_SlugField_4b3b6bbf" 
  ON "myapp_sample" ("SlugField"); 

CREATE INDEX "myapp_sample_ForeignKey_id_09008ff8" 
  ON "myapp_sample" ("ForeignKey_id"); 

CREATE UNIQUE INDEX myapp_sample_ManyToManyField_sample_id_manytomany_id_cd20a596_uniq 
  ON "myapp_sample_ManyToManyField" ("sample_id", "manytomany_id"); 

CREATE INDEX "myapp_sample_ManyToManyField_sample_id_379d0abf" 
  ON "myapp_sample_ManyToManyField" ("sample_id"); 

CREATE INDEX "myapp_sample_ManyToManyField_manytomany_id_2d47e8ad" 
  ON "myapp_sample_ManyToManyField" ("manytomany_id"); 

COMMIT; 

```

# SQL Server
## 対応表

|ModelField|DatabaseField|NOTNULL|CONSTRAINT|INDEX|
|:--:|:--:|:--:|:--:|:--:|
id|int IDENTITY (1, 1)|NOT NULL |PRIMARY KEY|○|
CharField|nvarchar(100) |NOT NULL||
SlugField|nvarchar(50) |NOT NULL||○|
URLField|nvarchar(200) |NOT NULL||
EmailField|nvarchar(254) |NOT NULL||
UUIDField|char(32) |NOT NULL||
FilePathField|nvarchar(100) |NOT NULL||
GenericIPAddressField|nvarchar(39)|NOT NULL||
TextField|nvarchar(max)|NOT NULL||
IntegerField|int|NOT NULL||
SmallIntegerField|smallint|NOT NULL||
BigIntegerField|bigint|NOT NULL||
PositiveIntegerField|int| CONSTRAINT ~ CHECK([PositiveIntegerField] >= 0) |NOT NULL||
PositiveSmallIntegerField| smallint | CONSTRAINT ~ CHECK ([PositiveSmallIntegerField] >= 0)|NOT NULL||
FloatField|double precision|NOT NULL||
DecimalField|numeric (5, 2)|NOT NULL||
BooleanField|bit|NOT NULL||
NullBooleanField|bit|NULL||
TimeField|time|NOT NULL||
DateField|date|NOT NULL||
DateTimeField|datetime2|NOT NULL||
DurationField|bigint|NOT NULL||
BinaryField|varbinary(max)|NOT NULL||
FileField|nvarchar(100) |NOT NULL||
ImageField|nvarchar(100) |NOT NULL||
ForeignKey_id|int|NOT NULL | |○|
OneToOneField_id|int|NOT NULL |UNIQUE|○|


```sql:
BEGIN TRANSACTION                                 --
-- Create model Foreign
--
CREATE TABLE [api_foreign] ([id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY); 

--
-- Create model ManyToMany
--
CREATE TABLE [api_manytomany] ([id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY); 

--
-- Create model OneToOne
--
CREATE TABLE [api_onetoone] ([id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY); 

--
-- Create model Sample
--
CREATE TABLE [api_sample] ( 
  [id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY
  , [CharField] nvarchar(100) NOT NULL
  , [SlugField] nvarchar(50) NOT NULL
  , [URLField] nvarchar(200) NOT NULL
  , [EmailField] nvarchar(254) NOT NULL
  , [UUIDField] char (32) NOT NULL
  , [FilePathField] nvarchar(100) NOT NULL
  , [GenericIPAddressField] nvarchar(39) NOT NULL
  , [TextField] nvarchar(max) NOT NULL
  , [IntegerField] int NOT NULL
  , [SmallIntegerField] smallint NOT NULL
  , [BigIntegerField] bigint NOT NULL
  , [PositiveIntegerField] int NOT NULL CONSTRAINT api_sample_PositiveIntegerField_c8107e2d_check CHECK
   ([PositiveIntegerField] >= 0)
  , [PositiveSmallIntegerField] smallint NOT NULL CONSTRAINT api_sample_PositiveSmallIntegerField_03485122_check
   CHECK ([PositiveSmallIntegerField] >= 0)
  , [FloatField] double precision NOT NULL
  , [DecimalField] numeric (5, 2) NOT NULL
  , [BooleanField] bit NOT NULL
  , [NullBooleanField] bit NULL
  , [TimeField] time NOT NULL
  , [DateField] date NOT NULL
  , [DateTimeField] datetime2 NOT NULL
  , [DurationField] bigint NOT NULL
  , [BinaryField] varbinary(max) NOT NULL
  , [FileField] nvarchar(100) NOT NULL
  , [ImageField] nvarchar(100) NOT NULL
  , [ForeignKey_id] int NOT NULL
  , [OneToOneField_id] int NOT NULL UNIQUE
); 

CREATE TABLE [api_sample_ManyToManyField] ( 
  [id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY
  , [sample_id] int NOT NULL
  , [manytomany_id] int NOT NULL
); 

ALTER TABLE [api_sample] ADD CONSTRAINT [api_sample_ForeignKey_id_e1233a0a_fk_api_foreign_id] FOREIGN
 KEY ([ForeignKey_id]) REFERENCES [api_foreign] ([id]); 

ALTER TABLE [api_sample] ADD CONSTRAINT [api_sample_OneToOneField_id_9c34197c_fk_api_onetoone_id] FOREIGN
 KEY ([OneToOneField_id]) REFERENCES [api_onetoone] ([id]); 

CREATE INDEX [api_sample_SlugField_32311b88] 
  ON [api_sample] ([SlugField]); 

CREATE INDEX [api_sample_ForeignKey_id_e1233a0a] 
  ON [api_sample] ([ForeignKey_id]); 

ALTER TABLE [api_sample_ManyToManyField] ADD CONSTRAINT [api_sample_ManyToManyField_sample_id_d0384bdf_fk_api_sample_id]
 FOREIGN KEY ([sample_id]) REFERENCES [api_sample] ([id]); 

ALTER TABLE [api_sample_ManyToManyField] ADD CONSTRAINT [api_sample_ManyToManyField_manytomany_id_2387c5f7_fk_api_manytomany_id]
 FOREIGN KEY ([manytomany_id]) REFERENCES [api_manytomany] ([id]); 

ALTER TABLE [api_sample_ManyToManyField] ADD CONSTRAINT api_sample_ManyToManyField_sample_id_manytomany_id_66194079_uniq
 UNIQUE ([sample_id], [manytomany_id]); 

CREATE INDEX [api_sample_ManyToManyField_sample_id_d0384bdf] 
  ON [api_sample_ManyToManyField] ([sample_id]); 

CREATE INDEX [api_sample_ManyToManyField_manytomany_id_2387c5f7] 
  ON [api_sample_ManyToManyField] ([manytomany_id]); 

COMMIT; 
```