mirror of
https://github.com/directus/directus.git
synced 2026-01-29 14:07:57 -05:00
552 lines
13 KiB
Markdown
552 lines
13 KiB
Markdown
---
|
|
description: REST and GraphQL API documentation on the Schema endpoint in Directus.
|
|
readTime: 5 min read
|
|
pageClass: page-reference
|
|
---
|
|
|
|
# Schema
|
|
|
|
> Retrieve and update the schema of an instance.
|
|
|
|
## Retrieve Schema Snapshot
|
|
|
|
Retrieve the current schema. This endpoint is only available to admin users.
|
|
|
|
### Query Parameters
|
|
|
|
Supports the [export](/reference/query#export) query parameter.
|
|
|
|
### Returns
|
|
|
|
Returns the JSON object containing schema details by default, or downloads it in an alternative format when `export`
|
|
query parameter is used.
|
|
|
|
### REST API
|
|
|
|
```
|
|
GET /schema/snapshot
|
|
```
|
|
|
|
##### Example
|
|
|
|
```
|
|
// returns JSON object
|
|
GET /schema/snapshot
|
|
|
|
// download as YAML file
|
|
GET /schema/snapshot?export=yaml
|
|
```
|
|
|
|
### GraphQL
|
|
|
|
n/a
|
|
|
|
## Retrieve Schema Difference
|
|
|
|
Compare the current instance's schema against the schema snapshot in JSON request body and retrieve the difference. This
|
|
endpoint is only available to admin users.
|
|
|
|
Alternatively, upload a JSON or YAML schema file. Relies on a `multipart/form-data` encoded request like regular file
|
|
uploads. Check [Upload a File](/reference/files#upload-a-file) for more information.
|
|
|
|
::: warning Different versions and vendors
|
|
|
|
This endpoint does not allow different Directus versions and database vendors by default. This is to avoid any
|
|
unintentional diffs from being generated. You can opt in to bypass these checks by passing the `force` query parameter.
|
|
|
|
:::
|
|
|
|
### Query Parameters
|
|
|
|
`force` **boolean**\
|
|
Bypass version and database vendor restrictions.
|
|
|
|
### Request Body
|
|
|
|
JSON object containing [collections](/reference/system/collections#the-collection-object),
|
|
[fields](/reference/system/fields#the-field-object), and [relations](/reference/system/relations#the-relation-object) to
|
|
apply.
|
|
|
|
Alternatively, send a JSON or YAML schema file in a `multipart/form-data` request. See
|
|
[Upload a File](/reference/files#upload-a-file) for more information.
|
|
|
|
### Returns
|
|
|
|
Returns the differences between the current instance's schema and the schema passed in the request body.
|
|
|
|
:::details **Toggle Open to See Sample Response**
|
|
|
|
```json
|
|
{
|
|
"hash": "2b3c71570228b864e16098147e5497f61b245a42",
|
|
"diff": {
|
|
"collections": [
|
|
{
|
|
"collection": "articles",
|
|
"diff": [
|
|
{
|
|
"kind": "N",
|
|
"rhs": {
|
|
"collection": "articles",
|
|
"meta": {
|
|
"accountability": "all",
|
|
"archive_app_filter": true,
|
|
"archive_field": null,
|
|
"archive_value": null,
|
|
"collapse": "open",
|
|
"collection": "articles",
|
|
"color": null,
|
|
"display_template": null,
|
|
"group": null,
|
|
"hidden": false,
|
|
"icon": null,
|
|
"item_duplication_fields": null,
|
|
"note": null,
|
|
"singleton": false,
|
|
"sort": null,
|
|
"sort_field": null,
|
|
"translations": null,
|
|
"unarchive_value": null
|
|
},
|
|
"schema": {
|
|
"name": "articles"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"fields": [
|
|
{
|
|
"collection": "articles",
|
|
"field": "id",
|
|
"diff": [
|
|
{
|
|
"kind": "N",
|
|
"rhs": {
|
|
"collection": "articles",
|
|
"field": "id",
|
|
"type": "integer",
|
|
"meta": {
|
|
"collection": "articles",
|
|
"conditions": null,
|
|
"display": null,
|
|
"display_options": null,
|
|
"field": "id",
|
|
"group": null,
|
|
"hidden": true,
|
|
"interface": "input",
|
|
"note": null,
|
|
"options": null,
|
|
"readonly": true,
|
|
"required": false,
|
|
"sort": null,
|
|
"special": null,
|
|
"translations": null,
|
|
"validation": null,
|
|
"validation_message": null,
|
|
"width": "full"
|
|
},
|
|
"schema": {
|
|
"name": "id",
|
|
"table": "articles",
|
|
"data_type": "integer",
|
|
"default_value": null,
|
|
"max_length": null,
|
|
"numeric_precision": null,
|
|
"numeric_scale": null,
|
|
"is_nullable": false,
|
|
"is_unique": false,
|
|
"is_primary_key": true,
|
|
"is_generated": false,
|
|
"generation_expression": null,
|
|
"has_auto_increment": true,
|
|
"foreign_key_table": null,
|
|
"foreign_key_column": null
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"collection": "articles",
|
|
"field": "title",
|
|
"diff": [
|
|
{
|
|
"kind": "N",
|
|
"rhs": {
|
|
"collection": "articles",
|
|
"field": "title",
|
|
"type": "string",
|
|
"meta": {
|
|
"collection": "articles",
|
|
"conditions": null,
|
|
"display": null,
|
|
"display_options": null,
|
|
"field": "title",
|
|
"group": null,
|
|
"hidden": false,
|
|
"interface": "input",
|
|
"note": null,
|
|
"options": null,
|
|
"readonly": false,
|
|
"required": false,
|
|
"sort": null,
|
|
"special": null,
|
|
"translations": null,
|
|
"validation": null,
|
|
"validation_message": null,
|
|
"width": "full"
|
|
},
|
|
"schema": {
|
|
"name": "title",
|
|
"table": "articles",
|
|
"data_type": "varchar",
|
|
"default_value": null,
|
|
"max_length": 255,
|
|
"numeric_precision": null,
|
|
"numeric_scale": null,
|
|
"is_nullable": true,
|
|
"is_unique": false,
|
|
"is_primary_key": false,
|
|
"is_generated": false,
|
|
"generation_expression": null,
|
|
"has_auto_increment": false,
|
|
"foreign_key_table": null,
|
|
"foreign_key_column": null
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"relations": []
|
|
}
|
|
}
|
|
```
|
|
|
|
:::
|
|
|
|
### REST API
|
|
|
|
```
|
|
POST /schema/diff
|
|
```
|
|
|
|
:::details **Toggle Open to See Sample Body**
|
|
|
|
```
|
|
POST /schema/diff
|
|
|
|
Content-Type: multipart/form-data; charset=utf-8; boundary=__X_BOUNDARY__
|
|
Content-Length: 3442422
|
|
|
|
--__X_BOUNDARY__
|
|
Content-Disposition: form-data; name="file"; filename="schema.yaml"
|
|
Content-Type: text/yaml
|
|
|
|
version: 1
|
|
directus: 9.22.4
|
|
vendor: sqlite
|
|
collections:
|
|
- collection: articles
|
|
meta:
|
|
accountability: all
|
|
archive_app_filter: true
|
|
archive_field: null
|
|
archive_value: null
|
|
collapse: open
|
|
collection: articles
|
|
color: null
|
|
display_template: null
|
|
group: null
|
|
hidden: false
|
|
icon: null
|
|
item_duplication_fields: null
|
|
note: null
|
|
singleton: false
|
|
sort: null
|
|
sort_field: null
|
|
translations: null
|
|
unarchive_value: null
|
|
schema:
|
|
name: articles
|
|
fields:
|
|
- collection: articles
|
|
field: id
|
|
type: integer
|
|
meta:
|
|
collection: articles
|
|
conditions: null
|
|
display: null
|
|
display_options: null
|
|
field: id
|
|
group: null
|
|
hidden: true
|
|
interface: input
|
|
note: null
|
|
options: null
|
|
readonly: true
|
|
required: false
|
|
sort: null
|
|
special: null
|
|
translations: null
|
|
validation: null
|
|
validation_message: null
|
|
width: full
|
|
schema:
|
|
name: id
|
|
table: articles
|
|
data_type: integer
|
|
default_value: null
|
|
max_length: null
|
|
numeric_precision: null
|
|
numeric_scale: null
|
|
is_nullable: false
|
|
is_unique: false
|
|
is_primary_key: true
|
|
is_generated: false
|
|
generation_expression: null
|
|
has_auto_increment: true
|
|
foreign_key_table: null
|
|
foreign_key_column: null
|
|
- collection: articles
|
|
field: title
|
|
type: string
|
|
meta:
|
|
collection: articles
|
|
conditions: null
|
|
display: null
|
|
display_options: null
|
|
field: title
|
|
group: null
|
|
hidden: false
|
|
interface: input
|
|
note: null
|
|
options: null
|
|
readonly: false
|
|
required: false
|
|
sort: null
|
|
special: null
|
|
translations: null
|
|
validation: null
|
|
validation_message: null
|
|
width: full
|
|
schema:
|
|
name: title
|
|
table: articles
|
|
data_type: varchar
|
|
default_value: null
|
|
max_length: 255
|
|
numeric_precision: null
|
|
numeric_scale: null
|
|
is_nullable: true
|
|
is_unique: false
|
|
is_primary_key: false
|
|
is_generated: false
|
|
generation_expression: null
|
|
has_auto_increment: false
|
|
foreign_key_table: null
|
|
foreign_key_column: null
|
|
relations: []
|
|
```
|
|
|
|
:::
|
|
|
|
### GraphQL
|
|
|
|
n/a
|
|
|
|
## Apply Schema Difference
|
|
|
|
Update the instance's schema by passing the diff previously retrieved via `/schema/diff` endpoint in the request body.
|
|
This endpoint is only available to admin users.
|
|
|
|
### Query Parameters
|
|
|
|
This endpoint doesn't currently support any query parameters.
|
|
|
|
### Request Body
|
|
|
|
JSON object containing hash and diffs of [collections](/reference/system/collections#the-collection-object),
|
|
[fields](/reference/system/fields#the-field-object), and [relations](/reference/system/relations#the-relation-object) to
|
|
apply.
|
|
|
|
### Returns
|
|
|
|
Empty body.
|
|
|
|
### REST API
|
|
|
|
```
|
|
POST /schema/apply
|
|
```
|
|
|
|
:::details **Toggle Open to See Sample Body**
|
|
|
|
```
|
|
POST /schema/apply
|
|
|
|
{
|
|
"hash": "2b3c71570228b864e16098147e5497f61b245a42",
|
|
"diff": {
|
|
"collections": [
|
|
{
|
|
"collection": "articles",
|
|
"diff": [
|
|
{
|
|
"kind": "N",
|
|
"rhs": {
|
|
"collection": "articles",
|
|
"meta": {
|
|
"accountability": "all",
|
|
"archive_app_filter": true,
|
|
"archive_field": null,
|
|
"archive_value": null,
|
|
"collapse": "open",
|
|
"collection": "articles",
|
|
"color": null,
|
|
"display_template": null,
|
|
"group": null,
|
|
"hidden": false,
|
|
"icon": null,
|
|
"item_duplication_fields": null,
|
|
"note": null,
|
|
"singleton": false,
|
|
"sort": null,
|
|
"sort_field": null,
|
|
"translations": null,
|
|
"unarchive_value": null
|
|
},
|
|
"schema": {
|
|
"name": "articles"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"fields": [
|
|
{
|
|
"collection": "articles",
|
|
"field": "id",
|
|
"diff": [
|
|
{
|
|
"kind": "N",
|
|
"rhs": {
|
|
"collection": "articles",
|
|
"field": "id",
|
|
"type": "integer",
|
|
"meta": {
|
|
"collection": "articles",
|
|
"conditions": null,
|
|
"display": null,
|
|
"display_options": null,
|
|
"field": "id",
|
|
"group": null,
|
|
"hidden": true,
|
|
"interface": "input",
|
|
"note": null,
|
|
"options": null,
|
|
"readonly": true,
|
|
"required": false,
|
|
"sort": null,
|
|
"special": null,
|
|
"translations": null,
|
|
"validation": null,
|
|
"validation_message": null,
|
|
"width": "full"
|
|
},
|
|
"schema": {
|
|
"name": "id",
|
|
"table": "articles",
|
|
"data_type": "integer",
|
|
"default_value": null,
|
|
"max_length": null,
|
|
"numeric_precision": null,
|
|
"numeric_scale": null,
|
|
"is_nullable": false,
|
|
"is_unique": false,
|
|
"is_primary_key": true,
|
|
"is_generated": false,
|
|
"generation_expression": null,
|
|
"has_auto_increment": true,
|
|
"foreign_key_table": null,
|
|
"foreign_key_column": null
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"collection": "articles",
|
|
"field": "title",
|
|
"diff": [
|
|
{
|
|
"kind": "N",
|
|
"rhs": {
|
|
"collection": "articles",
|
|
"field": "title",
|
|
"type": "string",
|
|
"meta": {
|
|
"collection": "articles",
|
|
"conditions": null,
|
|
"display": null,
|
|
"display_options": null,
|
|
"field": "title",
|
|
"group": null,
|
|
"hidden": false,
|
|
"interface": "input",
|
|
"note": null,
|
|
"options": null,
|
|
"readonly": false,
|
|
"required": false,
|
|
"sort": null,
|
|
"special": null,
|
|
"translations": null,
|
|
"validation": null,
|
|
"validation_message": null,
|
|
"width": "full"
|
|
},
|
|
"schema": {
|
|
"name": "title",
|
|
"table": "articles",
|
|
"data_type": "varchar",
|
|
"default_value": null,
|
|
"max_length": 255,
|
|
"numeric_precision": null,
|
|
"numeric_scale": null,
|
|
"is_nullable": true,
|
|
"is_unique": false,
|
|
"is_primary_key": false,
|
|
"is_generated": false,
|
|
"generation_expression": null,
|
|
"has_auto_increment": false,
|
|
"foreign_key_table": null,
|
|
"foreign_key_column": null
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"relations": []
|
|
}
|
|
}
|
|
```
|
|
|
|
:::
|
|
|
|
::: tip Hashes
|
|
|
|
The hash property in the diff is based on the target instance's schema and version. It is used to safeguard against
|
|
changes that may happen after the current diff was generated which can potentially incur unexpected side effects when
|
|
applying the diffs without this safeguard. In case the schema has been changed in the meantime, the diff must be
|
|
regenerated.
|
|
|
|
:::
|
|
|
|
### GraphQL
|
|
|
|
n/a
|