AdonisJS-데이터베이스 설정 소개

23773 단어 nodeadonisjs
우리 데이터에 대해 이야기합시다.본고에서 Lucid(Adonis JS SQL ORM)를 설정하고 이전을 이용하여 필요한 데이터베이스 테이블을 만들 것입니다.

선결 조건


본고는 컴퓨터에 SQL 데이터베이스 서버가 설치되어 있고 데이터베이스를 수동으로 만드는 방법을 알고 있다고 가정합니다.
만약 그렇지 않다면 설정 과정에서 sqlite 데이터베이스를 사용하는 것을 권장합니다.SQLite는 sqlite3 npm package을 제외하고는 아무것도 하지 않는 파일 기반 데이터베이스입니다.

선명한 설정


여느 때와 마찬가지로, 첫 번째 단계는 다음 명령을 실행하여 npm에서 패키지를 설치하는 것이다.
npm i @adonisjs/lucid@alpha
완료되면 다음 명령을 실행하여 패키지를 설정합니다.
node ace invoke @adonisjs/lucid
ace invoke 명령 실행 패키지에 공개된 instructions Javascript 파일.
  • PostgreSQL 데이터베이스를 사용하기로 결정했습니다.사용할 수 있는 모든 데이터베이스를 선택할 수 있습니다.
  • 설치 명령이 완료되면 환경 변수를 검증하는 코드를 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의 일부 기능입니다.
  • 활동 기록 ORM: Lucid의 데이터 모델은 Active record pattern을 따라 데이터베이스 상호작용을 간소화한다.CRUD 작업, 관계식, 모델을 JSON으로 시리얼화하는 등 모든 기본 기능이 포함됩니다.
  • 데이터베이스 조회 생성기: 데이터베이스 조회 생성기는 knex에 구축되어 자바스크립트 방법으로 SQL 조회를 구성할 수 있습니다.
    데이터베이스 조회 생성기는 데이터 모델보다 한 단계 낮습니다. 이것은 당신이 작성한 조회가 데이터베이스 드라이버에 그대로 전송되고 수정할 필요가 없다는 것을 의미합니다.이 기능은 고급 API 모델이 작성할 수 없는 복잡한 질의를 작성할 때 유용합니다.
  • 모드 이전: 이전은 코드를 사용하여 데이터베이스 모드를 만들고 개선할 수 있습니다.또한 마이그레이션 파일마다 한 번만 실행되는 추적 시스템도 내장되어 있습니다.
  • 모델 공장: Factories은 가짜 데이터로 데이터 모델을 만들거나 저장할 수 있습니다.테스트를 작성하거나 데이터베이스에 초기 기록집을 삽입할 때, 그것들은 보통 매우 유용하다.
  • 파종기: 데이터베이스 파종기는 공장과 함께 사용할 수도 있고 공장과 함께 사용하지 않아도 데이터베이스에 파종할 수 있다.예를 들어 저는 개발 과정에서 공장을 이용하여 랜덤 데이터를 파종할 것입니다. 몇 개의 파종기가 있을 수 있습니다. 그 중에서 실제 데이터를 포함할 수 있습니다. 예를 들어 응용 프로그램을 배치하기 전에 데이터베이스에 있어야 하는 국가 목록입니다.
  • 모드 마이그레이션


    개술 부분에서 말한 바와 같이 모델 이전은 우리가 코드를 사용하여 데이터베이스 모델을 만들 수 있도록 허용한다.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.범주 이름
  • 의 URL 친화적 버전입니다.
  • , 마지막으로 색상 코드입니다.이것은 단지 사용자 인터페이스를 강화하기 위한 것이다.
  • 다음ace 명령을 실행해서 이 이전을 실행합니다.또한 데이터베이스를 먼저 수동으로 만들었는지 확인하십시오.
    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 장식기를 적용해야 합니다.이것은 표준 모델의 속성과 표열을 명확하게 구분하는 데 도움이 된다.
  • 열 이름 옆에 있는 데이터 형식은 Typescript 데이터 형식입니다.여기서 우리는 varchar과 같은 데이터베이스 유형을 처리하지 않는다.Typescript에 대해 varchar라는 것은 없습니다.
  • 마지막으로 모델에서camelcase 속성 이름을 사용할 수 있습니다. SQL 조회 기간에 우리는 그것들을 snake case로 변환합니다.예: colorCodecolor_code이 됩니다.
  • todos 모델 생성하기

    todos표를 위해 모델을 만들고 TodoCategory모델 간의 관계를 설정합니다.
    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 도구에서 데이터베이스를 열고 올바른 외부 키를 사용하여 해당 데이터베이스 테이블에 행을 추가했는지 확인할 수 있습니다.

    좋은 웹페이지 즐겨찾기