* docs: add documentation for migration generate cli tool * changed migrations details in marketplace recipe * added generated oas files to action * vale + lint fixes * don't import from src in medusa-config.js * fix generate command in recipe * fix module name
104 lines
3.2 KiB
Plaintext
104 lines
3.2 KiB
Plaintext
export const metadata = {
|
||
title: `${pageNumber} Data Models`,
|
||
}
|
||
|
||
# {metadata.title}
|
||
|
||
In this chapter, you’ll learn what data models are and how to create a data model.
|
||
|
||
## What is a Data Model?
|
||
|
||
A data model is a class that represents a table in the database. It's created in a module.
|
||
|
||
---
|
||
|
||
## How to Create a Data Model?
|
||
|
||
<Note title="Steps Summary">
|
||
|
||
1. Create a data model in a module.
|
||
2. Generate migration for the data model.
|
||
4. Run migration to add the data model's table in the database.
|
||
|
||
</Note>
|
||
|
||
A data model is created in a TypeScript or JavaScript file under a module's `models` directory. It's defined using the `model` utility imported from `@medusajs/utils`.
|
||
|
||
For example, create the file `src/modules/hello/models/my-custom.ts` with the following content:
|
||
|
||
```ts title="src/modules/hello/models/my-custom.ts"
|
||
import { model } from "@medusajs/utils"
|
||
|
||
const MyCustom = model.define("my_custom", {
|
||
id: model.id().primaryKey(),
|
||
name: model.text(),
|
||
})
|
||
|
||
export default MyCustom
|
||
```
|
||
|
||
You define a data model using the `model`'s `define` method. It accepts two parameters:
|
||
|
||
1. The first one is the name of the data model's table in the database. It should be in snake-case form.
|
||
2. The second is an object, which is the data model's schema. The schema's properties are defined using the `model`'s methods.
|
||
|
||
The example above defines the data model `MyCustom` with the properties `id` and `name`.
|
||
|
||
### Generate a Migration
|
||
|
||
A migration defines changes to be made in the database, such as create or update tables.
|
||
|
||
To generate a migration for the data models in your module, run the following command:
|
||
|
||
```bash
|
||
npx medusa migrations generate helloModuleService
|
||
```
|
||
|
||
The `migrations generate` command of the Medusa CLI accepts one or more module names (for example, `helloModuleService`) to generate the migration for.
|
||
|
||
The above command creates a migration file at the directory `src/modules/hello/migrations` similar to the following:
|
||
|
||
```ts
|
||
import { Migration } from "@mikro-orm/migrations"
|
||
|
||
export class Migration20240702105919 extends Migration {
|
||
|
||
async up(): Promise<void> {
|
||
this.addSql("create table if not exists \"my_custom\" (\"id\" text not null, \"name\" text not null, \"created_at\" timestamptz not null default now(), \"updated_at\" timestamptz not null default now(), \"deleted_at\" timestamptz null, constraint \"my_custom_pkey\" primary key (\"id\"));")
|
||
}
|
||
|
||
async down(): Promise<void> {
|
||
this.addSql("drop table if exists \"my_custom\" cascade;")
|
||
}
|
||
|
||
}
|
||
```
|
||
|
||
In the migration class, the `up` method creates the table `my_custom` and defines its columns. The `down` method drops the table.
|
||
|
||
### Run Migration
|
||
|
||
To reflect the changes in the generated migration file, run the `migration` command:
|
||
|
||
```bash
|
||
npx medusa migrations run
|
||
```
|
||
|
||
If ran successfully, the `my_custom` table will be created in the database.
|
||
|
||
---
|
||
|
||
## When to Use Data Models
|
||
|
||
<Note title="Use data models when" type="success">
|
||
|
||
- You want to store data related to your customization in the database.
|
||
|
||
</Note>
|
||
|
||
<Note title="Don't use data models if" type="error">
|
||
|
||
- You want to store simple key-value pairs related to an existing data model. Instead, use the `metadata` field that most existing models have, which is an object of custom key-value pairs.
|
||
|
||
</Note>
|