UI/BE : DB, Node

[ BE / DB ] SQLite을 활용하여 local에 데이터 저장하기(Feat. 공홈)

Soo_Parkle 2024. 11. 23. 22:22

아래의 정보는 expo 공식 사이트에서 가져온 코드를 해석해본 내용이다.

 

SQLite

A library that provides access to a database that can be queried through a SQLite API.

docs.expo.dev

 

Basic CRUD opereations

const db = await SQLite.openDatabaseAsync('databaseName');

// `execAsync()` is useful for bulk queries when you want to execute altogether.
// Please note that `execAsync()` does not escape parameters and may lead to SQL injection.
await db.execAsync(`
PRAGMA journal_mode = WAL;
CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL, intValue INTEGER);
INSERT INTO test (value, intValue) VALUES ('test1', 123);
INSERT INTO test (value, intValue) VALUES ('test2', 456);
INSERT INTO test (value, intValue) VALUES ('test3', 789);
`);

// `runAsync()` is useful when you want to execute some write operations.
const result = await db.runAsync('INSERT INTO test (value, intValue) VALUES (?, ?)', 'aaa', 100);
console.log(result.lastInsertRowId, result.changes);
await db.runAsync('UPDATE test SET intValue = ? WHERE value = ?', 999, 'aaa'); // Binding unnamed parameters from variadic arguments
await db.runAsync('UPDATE test SET intValue = ? WHERE value = ?', [999, 'aaa']); // Binding unnamed parameters from array
await db.runAsync('DELETE FROM test WHERE value = $value', { $value: 'aaa' }); // Binding named parameters from object

// `getFirstAsync()` is useful when you want to get a single row from the database.
const firstRow = await db.getFirstAsync('SELECT * FROM test');
console.log(firstRow.id, firstRow.value, firstRow.intValue);

// `getAllAsync()` is useful when you want to get all results as an array of objects.
const allRows = await db.getAllAsync('SELECT * FROM test');
for (const row of allRows) {
  console.log(row.id, row.value, row.intValue);
}

// `getEachAsync()` is useful when you want to iterate SQLite query cursor.
for await (const row of db.getEachAsync('SELECT * FROM test')) {
  console.log(row.id, row.value, row.intValue);
}

 

 

 

1. 데이터베스트 열기

const db = await SQLite.openDatabaseAsync('databaseName');
  • openDatabaseAsync() 메서드는 SQLite 데이터베이스를 열거나 생성.
  • databaseName은 데이터베이스 파일의 이름입니다. 해당 파일이 없으면 새로 생성.

 

 

2. SQL, 여러 쿼리 한 번에 실행하기

await db.execAsync(`
PRAGMA journal_mode = WAL;
CREATE TABLE IF NOT EXISTS tea (id INTEGER PRIMARY KEY NOT NULL, value TEXT NOT NULL, intValue INTEGER);
INSERT INTO tea (value, intValue) VALUES ('test1', 123);
INSERT INTO tea (value, intValue) VALUES ('test2', 456);
INSERT INTO tea (value, intValue) VALUES ('test3', 789);
`);
  • execAsync()는 여러 SQL 명령어를 한 번에 실행.
  • PRAGMA journal_mode = WAL; 
SQLite 설정 명령으로 Write-Ahead Logging (WAL) 모드를 활성화하여 동시성을 향상.

 

  • CREATE TABLE IF NOT EXISTS
    • tea라는 이름의 테이블을 만듭니다. 테이블이 이미 존재하면 새로 생성하지 않음.
    • 테이블 컬럼: 
- id: 기본 키 (PRIMARY KEY)
- value: 텍스트 데이터
- intValue: 정수 데이터

 

  • INSERT INTO
    • tea 테이블에 초기 데이터를 삽입.

 

 

 

4. 데이터 삽입

const result = await db.runAsync('INSERT INTO test (value, intValue) VALUES (?, ?)', 'aaa', 100); console.log(result.lastInsertRowId, result.changes);

 

  • runAsync(): SQL 쓰기 작업(INSERT, UPDATE, DELETE)을 실행.
    • ?: 매개변수 바인딩을 사용해 SQL 인젝션 방지.
    • 'aaa', 100이 각각 value와 intValue에 삽입.
  • 결과
    • result.lastInsertRowId: 삽입된 행의 ID.
    • result.changes: 변경된 행 수.

 

 

5. 데이터 삭제

await db.runAsync('DELETE FROM test WHERE value = $value', { $value: 'aaa' });

 

  • Named Parameter 바인딩:
    • $value라는 이름의 변수에 'aaa' 값을 바인딩.
  • SQL 명령은 value = 'aaa'인 행을 삭제.

 

 

6. 첫 번째 행 가져오기

const firstRow = await db.getFirstAsync('SELECT * FROM test');
console.log(firstRow.id, firstRow.value, firstRow.intValue);
  • getFirstAsync():
    • 결과에서 첫 번째 행만 반환.
  • 반환값은 객체 형식이며, 각 컬럼(id, value, intValue)에 접근할 수 있다.

 

 

7. 모든 데이터 가져오기

const allRows = await db.getAllAsync('SELECT * FROM test');
for (const row of allRows) { console.log(row.id, row.value, row.intValue); }

 

  • getAllAsync():
    • 쿼리 결과를 배열 형식으로 반환.
    • SELECT * FROM test는 모든 데이터를 가져.
  • 루프 처리:
    • 각 행은 객체이며, 반복문에서 각각의 컬럼 데이터를 출력.