@loopback/docs
Version:
Documentation files rendered at [https://loopback.io](https://loopback.io)
144 lines (115 loc) • 3.86 kB
Markdown
---
lang: en
title: 'Running on relational databases'
keywords: LoopBack 4.0, LoopBack 4, Node.js, TypeScript, OpenAPI, Tutorial
sidebar: lb4_sidebar
permalink: /doc/en/lb4/todo-list-tutorial-sqldb.html
summary:
LoopBack 4 TodoList Application Tutorial - Running on Relational Databases
---
If you are running this example using a relational database, there are extra
steps in order to set up constraints in the database. We're using PostgreSQL for
illustration, but it would work for other relational databases in a similar way.
### Create a new datasource
We're going to update the DataSource `db` to connect to the PostgreSQL database
instead of the in-memory database.
First, remove the existing `db`, run:
```sh
rm src/datasources/db.datasource.*
```
Then, create the datasource with the same name with the `lb4 datasource` command
and select `PostgreSQL` as the connector.
```sh
$ lb4 datasource
? Datasource name: db
? Select the connector for db:
Redis key-value connector (supported by StrongLoop)
MongoDB (supported by StrongLoop)
MySQL (supported by StrongLoop)
❯ PostgreSQL (supported by StrongLoop)
Oracle (supported by StrongLoop)
Microsoft SQL (supported by StrongLoop)
REST services (supported by StrongLoop)
...
```
### Specify the foreign key constraint in the models
Based on the model relations we've specified in the 3 models, the expected
database tables look like below:

{% include note.html content="
There is ongoing work on supporting strong relations with referential integrity. For details, please see [epic #2231](https://github.com/strongloop/loopback-next/issues/2331).
" %}
#### Specify the foreign key constraints in Todo model
We will use the `foreignKeys` attribute to determine the constraints in the
database table.
In `src/models/todo.model.ts`, add the `settings` options in the ``
decorator.
```ts
({
settings: {
foreignKeys: {
fk_todo_todoListId: {
name: 'fk_todo_todoListId',
entity: 'TodoList',
entityKey: 'id',
foreignKey: 'todoListId',
},
},
},
})
export class Todo extends Entity {
//etc.
}
```
Check out the details for
[auto-migrate and auto-update](https://loopback.io/doc/en/lb4/PostgreSQL-connector.html#auto-migrateauto-update-models-with-foreign-keys)
for PostgreSQL connector. For other connectors, go to the corresponding
connector from the
[Connectors Reference](https://loopback.io/doc/en/lb4/Connectors-reference.html)
section.
#### Specify the foreign key constraints in TodoListImage model
Similar to the `Todo` model, we will specify the constraints in the `settings`.
```ts
({
settings: {
foreignKeys: {
fk_todoListImage_todoListId: {
name: 'fk_todoListImage_todoListId',
entity: 'TodoList',
entityKey: 'id',
foreignKey: 'todoListId',
},
},
},
})
export class TodoListImage extends Entity {
//etc.
}
```
### Database migration using `npm run migrate` command
The order of table creation is important. We are going to migrate `TodoList`
model before the `Todo` and `TodoListImage` models.
In `src/migrate.ts`, modify this line:
```ts
await app.migrateSchema({existingSchema});
```
to:
```ts
await app.migrateSchema({
existingSchema,
// The order of table creation is important.
// A referenced table must exist before creating a
// foreign key constraint.
// For PostgreSQL connector, it does not create tables in the
// right order. Therefore, this change is needed.
models: ['TodoList', 'Todo', 'TodoListImage'],
});
```
Run the following commands:
```sh
$ npm run build
$ npm run migrate
```
The `todolist`, `todo` and `todolistimage` tables are created.
For details, see the [Database migrations](../../Database-migrations.md)
documentation page.