Drizzle <> OP SQLite

**공식 GitHub 페이지**에 따르면,
OP-SQLite는 최신 버전의 SQLite를 내장하고 있으며, SQL 쿼리를 실행할 수 있는 저수준 API를 제공합니다.

npm
yarn
pnpm
bun
npm i drizzle-orm @op-engineering/op-sqlite
npm i -D drizzle-kit
import { drizzle } from "drizzle-orm/op-sqlite";
import { open } from '@op-engineering/op-sqlite';

const opsqlite = open({
  name: 'myDB',
});
const db = drizzle(opsqlite);

await db.select().from(users);

Drizzle Kit을 사용해 SQL 마이그레이션을 생성할 수 있습니다.
진행하기 전에 Drizzle Kit 마이그레이션이 어떻게 동작하는지 확인하세요.
OP SQLite는 앱에 SQL 마이그레이션을 번들로 포함해야 하며, 이 부분은 이미 준비되어 있습니다.

Babel 플러그인 설치

SQL 마이그레이션 파일을 문자열로 직접 번들에 포함시키려면 다음 플러그인이 필요합니다.

npm install babel-plugin-inline-import

설정 파일 업데이트

babel.config.js, metro.config.js, drizzle.config.ts 파일을 업데이트해야 합니다.

babel.config.js
module.exports = {
  presets: ['module:@react-native/babel-preset'],
  plugins: [
    [
      'inline-import',
      {
        extensions: ['.sql'],
      },
    ],
  ],
};
metro.config.js
const { getDefaultConfig } = require('@react-native/metro-config');

const config = getDefaultConfig(__dirname);

config.resolver.sourceExts.push('sql');

module.exports = config;

Drizzle Kit 설정에서 dialect: 'sqlite'driver: 'expo'를 반드시 포함해야 합니다.

drizzle.config.ts
import type { Config } from 'drizzle-kit';

export default {
	schema: './db/schema.ts',
	out: './drizzle',
  dialect: 'sqlite',
	driver: 'expo', // <--- 매우 중요
} satisfies Config;

마이그레이션 생성하기

SQL 스키마 파일과 drizzle.config.ts 파일을 생성한 후, 마이그레이션을 생성할 수 있습니다.

npx drizzle-kit generate

앱에 마이그레이션 추가하기

이제 ./drizzle 폴더에서 migrations.js 파일을 여러분의 Expo/React Native 앱으로 가져와야 합니다. 앱 시작 시 마이그레이션을 실행하려면 커스텀 useMigrations 마이그레이션 훅을 사용하거나, 원하는 대로 useEffect 훅에서 수동으로 실행할 수 있습니다.

App.tsx
import { drizzle } from "drizzle-orm/op-sqlite";
import { open } from '@op-engineering/op-sqlite';
import { useMigrations } from 'drizzle-orm/op-sqlite/migrator';
import migrations from './drizzle/migrations';

const opsqliteDb = open({
  name: 'myDB',
});

const db = drizzle(opsqliteDb);

export default function App() {
  const { success, error } = useMigrations(db, migrations);

  if (error) {
    return (
      
        마이그레이션 오류: {error.message}
      
    );
  }

  if (!success) {
    return (
      
        마이그레이션 진행 중...
      
    );
  }

  return ...여러분의 애플리케이션 컴포넌트;
}