Drift에서 특정 행 삭제하기: delete()와 .where()의 활용

pharmDev·2024년 12월 19일

removeSchedule 메서드 설명

Future<int> removeSchedule(int id) => (delete(scheduleTable)
      ..where(
        (table) => table.id.equals(id),
      ))
    .go();

이 코드는 id가 특정 값인 데이터 행을 삭제하는 메서드입니다. 주로 데이터베이스에서 레코드를 삭제할 때 사용됩니다. 초보 개발자를 위해 코드를 순서대로 상세히 주석을 추가하며 설명하겠습니다.


코드 해석

1. 메서드 정의

Future<int> removeSchedule(int id)
  • removeSchedule: 테이블에서 특정 id를 가진 데이터를 삭제하는 메서드입니다.
  • int id: 삭제할 데이터의 고유 식별자(ID)입니다. 이 값으로 어떤 행(row)을 삭제할지 결정합니다.
  • Future<int>: 비동기 작업의 결과로 반환되는 값의 타입입니다.
    • 삭제가 성공하면, 삭제된 행(row)의 수를 int로 반환합니다.
    • 예: 1개의 행을 삭제하면 1이 반환됩니다.

2. 삭제 작업 시작

(delete(scheduleTable)
  • delete(scheduleTable): scheduleTable 테이블에서 데이터를 삭제하는 작업을 시작합니다.
  • delete()는 Drift에서 데이터를 삭제하기 위해 사용되는 메서드입니다.

3. 삭제할 행 필터링

..where(
  (table) => table.id.equals(id),
)
  • ..where(...): delete 작업에 조건을 추가합니다.
    • ..Cascade Operator로, 같은 객체에 여러 메서드를 연속적으로 호출할 수 있게 해줍니다.
  • (table) => table.id.equals(id):
    • 테이블의 id 열이 메서드에 전달된 id 값과 같은 행(row)만 삭제하도록 조건을 정의합니다.
    • 예를 들어, id가 5라면 SQL로는 다음과 같은 조건을 추가합니다:
      DELETE FROM scheduleTable WHERE id = 5;

4. 쿼리 실행

.go();
  • .go(): 실제로 데이터베이스에서 삭제 작업을 실행합니다.
  • .go()는 Drift에서 데이터 수정 작업(INSERT, UPDATE, DELETE)을 실행할 때 사용하는 메서드입니다.
  • 실행 결과로 삭제된 행(row)의 수를 반환합니다.

전체 동작 순서

  1. delete(scheduleTable)scheduleTable에서 데이터를 삭제하는 작업을 시작합니다.
  2. 조건 추가: ..where(...)id 열이 특정 값과 같은 행만 삭제하도록 조건을 설정합니다.
  3. .go()를 호출하여 데이터베이스에서 삭제 작업을 실행합니다.
  4. 삭제된 행의 수(예: 1)를 비동기로 반환합니다.

주석을 추가한 전체 코드

Future<int> removeSchedule(int id) => 
  (delete(scheduleTable) // 1. scheduleTable에서 데이터를 삭제하는 작업 시작
      ..where( // 2. 삭제 조건 추가
        (table) => table.id.equals(id), // table의 id 열이 전달받은 id 값과 같은 행만 삭제
      ))
    .go(); // 3. 쿼리를 실행하고 삭제된 행의 수를 반환

SQL로 변환

위 코드는 SQL로 다음과 같이 표현됩니다:

DELETE FROM scheduleTable WHERE id = ?;
  • ?는 코드에서 전달한 id 값(예: 5)으로 대체됩니다.

실제 사용 예제

removeSchedule 메서드는 다음과 같이 호출될 수 있습니다:

void deleteSchedule(int id) async {
  final db = AppDatabase(); // 데이터베이스 객체 생성
  final deletedRows = await db.removeSchedule(id); // id가 일치하는 데이터 삭제

  print('Deleted $deletedRows row(s).'); // 삭제된 행의 수 출력
}

요약

  • 이 메서드는 특정 id 값을 기준으로 데이터를 삭제하는 역할을 합니다.
  • delete(scheduleTable)로 삭제 작업을 시작하고, ..where(...)로 삭제 조건을 설정합니다.
  • .go()를 호출하여 데이터베이스에서 작업을 실행하고, 삭제된 행의 수를 반환합니다.
  • Drift가 SQL 문을 추상화하여 직관적으로 사용할 수 있도록 돕습니다!

Dart의 Drift에서 delete행(row)만 삭제하는 데 사용됩니다. 열(column)을 삭제하거나 수정하는 기능은 없습니다. 테이블의 구조(즉, 열)를 변경하려면 스키마 변경 작업이 필요합니다.


delete의 역할

  • 삭제 대상: 데이터베이스 테이블의 행(row)입니다.
  • 사용 목적: 특정 조건을 만족하는 데이터를 삭제합니다.
  • 제한: 테이블의 열(column) 자체를 삭제하거나 추가할 수는 없습니다.

예를 들어, 다음 코드는 scheduleTable에서 특정 조건을 만족하는 행을 삭제합니다:

(delete(scheduleTable)..where((table) => table.id.equals(id))).go();

위 코드에서 id가 특정 값과 일치하는 행만 삭제됩니다.


열(column)을 삭제하거나 변경하려면?

데이터베이스 테이블의 열 자체를 삭제하거나 추가하려면 스키마 변경 작업을 수행해야 합니다. Drift에서는 이를 지원하기 위해 마이그레이션(Migration) 기능을 제공합니다.

스키마 변경 예제

스키마 변경 작업은 테이블 구조를 업데이트할 때 사용됩니다. 예를 들어, 열을 삭제하려면 다음과 같은 작업을 수행해야 합니다:

  1. 기존 테이블 복사:

    • 기존 데이터를 포함하는 새 테이블을 생성합니다.
  2. 기존 테이블 삭제:

    • 원래 테이블을 삭제합니다.
  3. 새 테이블 이름 변경:

    • 새 테이블의 이름을 원래 테이블 이름으로 변경합니다.

Drift에서 스키마 변경 구현:


MigrationStrategy get migration => MigrationStrategy(
  onUpgrade: (migrator, from, to) async {
    if (from == 1 && to == 2) {
      // 1. 새로운 테이블 생성 (열 삭제 반영)
      await migrator.createTable(newTable);

      // 2. 기존 데이터를 새로운 테이블로 복사
      await migrator.insertInto(
        newTable,
        select(oldTable).get(),
      );

      // 3. 기존 테이블 삭제
      await migrator.deleteTable('old_table');

      // 4. 새 테이블의 이름을 원래 테이블 이름으로 변경
      await migrator.renameTable('new_table', 'old_table');
    }
  },
);

요약

  • delete는 행(row)만 삭제합니다. 조건에 맞는 데이터를 제거하는 데 사용됩니다.
  • 열(column)을 삭제하거나 수정하려면 스키마 변경 작업(마이그레이션)이 필요합니다.
  • Drift는 스키마 변경 작업을 지원하며, 마이그레이션을 통해 테이블 구조를 업데이트할 수 있습니다.

행(row) 삭제는 데이터 조작 작업(DDL), 열(column) 삭제는 데이터 정의 작업(DDL)에 해당하므로 구분해서 사용해야 합니다.

profile
코딩을 배우는 초보

0개의 댓글