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는 모든 데이터를 가져.
- 루프 처리:
- 각 행은 객체이며, 반복문에서 각각의 컬럼 데이터를 출력.