AdonisJS-데이터베이스 설정 소개
선결 조건
본고는 컴퓨터에 SQL 데이터베이스 서버가 설치되어 있고 데이터베이스를 수동으로 만드는 방법을 알고 있다고 가정합니다.
만약 그렇지 않다면 설정 과정에서
sqlite
데이터베이스를 사용하는 것을 권장합니다.SQLite는 sqlite3 npm package을 제외하고는 아무것도 하지 않는 파일 기반 데이터베이스입니다.선명한 설정
여느 때와 마찬가지로, 첫 번째 단계는 다음 명령을 실행하여 npm에서 패키지를 설치하는 것이다.
npm i @adonisjs/lucid@alpha
완료되면 다음 명령을 실행하여 패키지를 설정합니다.node ace invoke @adonisjs/lucid
ace invoke
명령 실행 패키지에 공개된 instructions Javascript 파일.env.ts
파일로 복사해야 합니다.환경 변수는 외부에서 주입되기 때문에, AdonisJS는 이 변수를 검증하고, 프로그램이 항상 정확한 설정 값 집합을 사용하도록 하는 것을 권장합니다.
config/database.ts
파일은 데이터베이스와 관련된 모든 구성을 저장합니다..env
파일에서 업데이트할 수 있습니다.제 가치관은요. PG_HOST=localhost
PG_PORT=5432
PG_USER=virk
PG_PASSWORD=
PG_DB_NAME=todo
데이터베이스 개요
코드를 작성하기 전에 Adonis JS 데이터 계층을 간략하게 소개하겠습니다.SQL 데이터베이스를 처리하는 in-house ORM (Lucid)을 제공합니다.
다음은 모든 주요 SQL 데이터베이스에 대한 지원을 제외하고 Lucid의 일부 기능입니다.
데이터베이스 조회 생성기는 데이터 모델보다 한 단계 낮습니다. 이것은 당신이 작성한 조회가 데이터베이스 드라이버에 그대로 전송되고 수정할 필요가 없다는 것을 의미합니다.이 기능은 고급 API 모델이 작성할 수 없는 복잡한 질의를 작성할 때 유용합니다.
모드 마이그레이션
개술 부분에서 말한 바와 같이 모델 이전은 우리가 코드를 사용하여 데이터베이스 모델을 만들 수 있도록 허용한다.todo 프로그램에 필요한 표를 만듭니다.
범주 테이블 만들기
node ace make:migration categories
# CREATE: database/migrations/1606195827305_categories.ts
새로 만든 파일을 열고 다음 코드 세그먼트를 붙여넣습니다.import BaseSchema from '@ioc:Adonis/Lucid/Schema'
export default class Categories extends BaseSchema {
protected tableName = 'categories'
public async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id').notNullable().primary()
table.string('name', 200).notNullable()
table.string('slug', 200).notNullable().unique()
table.string('color_code', 6).notNullable()
table.timestamps()
})
}
public async down() {
this.schema.dropTable(this.tableName)
}
}
up
방법은 node ace migration:run
명령 기간에 실행된 조작에 사용됩니다.down
방법은 up
방법에서 실행한 조작을 취소해야 한다.만약 up 방법이 시계를 만들었다면,down 방법은 이 시계를 삭제해야 합니다.categories
표를 작성한 4열id
name
slug
.범주 이름 node ace migration:run
# migrated database/migrations/1606195827305_categories
# Migrated in 173 ms
같은 명령을 다시 실행하면 다음 메시지를 받을 수 있습니다.node ace migration:run
# Already up to date
이는 Lucid가 마이그레이션 파일을 추적하여 다시 실행하지 않기 때문입니다.단, 개발 과정에서 다음과 같은ace 명령을 사용하여 rollback your changes을 실행할 수 있다.node ace migration:rollback
todos 테이블 만들기
todos표를 만드는 같은 과정을 반복합시다.
node ace make:migration todos
# CREATE: database/migrations/1606197725778_todos.ts
새로 만든 파일을 열고 다음 코드를 붙여넣습니다.import BaseSchema from '@ioc:Adonis/Lucid/Schema'
export default class Todos extends BaseSchema {
protected tableName = 'todos'
public async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id').notNullable().primary()
table
.integer('category_id')
.unsigned()
.notNullable()
.references('id')
.inTable('categories')
table.text('title').notNullable()
table.boolean('is_completed').notNullable().defaultTo(false)
table.timestamps()
})
}
public async down() {
this.schema.dropTable(this.tableName)
}
}
todos 이전 파일에서 우리는 데이터베이스 단계에서 category_id
에 대해 외부 키 제약을 정의했다.마지막으로 다음 명령을 실행하여 todos표를 만듭니다.
node ace migration:run
# migrated database/migrations/1606197725778_todos
# Migrated in 159 ms
데이터 모델
데이터 모델은 ES6 클래스이며 각 클래스는 하나의 데이터베이스 테이블과 상호작용을 담당한다.응용 프로그램에 대해 우리는 두 개의 데이터 모델이 필요하다. 하나는
todos
표이고, 다른 하나는 categories
표이다.또한 모델과 이동은 서로 관련된 것이 아니라 두 개의 독립된 도구로 서로 다른 임무를 수행한다.마이그레이션할 필요가 없는 데이터 모델을 가질 수 있으며, 그 반대의 경우도 마찬가지입니다.
카테고리 모델 생성하기
다음 명령을 실행하면
categories
테이블에 모델을 생성합니다.node ace make:model Category
# CREATE: app/Models/Category.ts
새로 만든 파일을 열고 다음 코드를 붙여넣습니다.import { DateTime } from 'luxon'
import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'
export default class Category extends BaseModel {
@column({ isPrimary: true })
public id: number
@column()
public name: string
@column()
public slug: string
@column()
public colorCode: string
@column.dateTime({ autoCreate: true })
public createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
public updatedAt: DateTime
}
@column
장식기를 적용해야 합니다.이것은 표준 모델의 속성과 표열을 명확하게 구분하는 데 도움이 된다.varchar
과 같은 데이터베이스 유형을 처리하지 않는다.Typescript에 대해 varchar라는 것은 없습니다.colorCode
은 color_code
이 됩니다.todos 모델 생성하기
todos
표를 위해 모델을 만들고 Todo
과 Category
모델 간의 관계를 설정합니다.node ace make:model Todo
# CREATE: app/Models/Todo.ts
import { DateTime } from 'luxon'
import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'
export default class Todo extends BaseModel {
@column({ isPrimary: true })
public id: number
@column()
public categoryId: number
@column()
public title: string
@column()
public isCompleted: boolean
@column.dateTime({ autoCreate: true })
public createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
public updatedAt: DateTime
}
관계를 맺다
다음은 TODO와 범주 간의 관계입니다.
Category
모델을 사용하여 관련 TODO를 가져오므로 hasMany
관계식만 설정합니다.app/Models/Category.ts
파일을 열고 다음 가져오기 문을 추가합니다.import { BaseModel, column, hasMany, HasMany } from '@ioc:Adonis/Lucid/Orm'
import Todo from 'App/Models/Todo'
다음에 관계를 클래스의 속성으로 정의합니다.export default class Category extends BaseModel {
// ....
@hasMany(() => Todo)
public todos: HasMany<typeof Todo>
}
프레젠테이션 시간
모든 것이 다 준비되었다.Adonis JS repl을 시작하고 모델을 사용하여 쿼리를 실행합니다.
node ace repl
과다 입력을 방지하려면 REPL 세션에서 다음 코드 세그먼트를 복사/붙여넣을 수 있습니다.다음 방법을 실행하여 모델을 로드합니다.
loadModels()
개인 범주 만들기
const personal = await models.Category.create({ name: 'Personal', slug: 'personal', colorCode: '4fd1c5' })
작업 범주 만들기
const work = await models.Category.create({ name: 'Work', slug: 'work', colorCode: 'e53e3e' })
작업 클래스에 todo 추가
await work.related('todos').create({ title: 'Kick start "Introducing AdonisJS" articles series on dev.to' })
개인 범주에 업무 추가
await personal.related('todos').create({ title: 'Buy groceries when going back to home. Make sure to buy some chocolates too' })
일부 GUI 도구에서 데이터베이스를 열고 올바른 외부 키를 사용하여 해당 데이터베이스 테이블에 행을 추가했는지 확인할 수 있습니다.
Reference
이 문제에 관하여(AdonisJS-데이터베이스 설정 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/amanvirk1/introducing-adonisjs-database-setup-3936텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)