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 { defineConfig } from 'drizzle-kit';

export default defineConfig({
	schema: './db/schema.ts',
	out: './drizzle',
  dialect: 'sqlite',
	driver: 'expo', // <--- 맀우 μ€‘μš”ν•©λ‹ˆλ‹€
});

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 생성

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 (
      <View>
        <Text>Migration error: {error.message}</Text>
      </View>
    );
  }

  if (!success) {
    return (
      <View>
        <Text>Migration is in progress...</Text>
      </View>
    );
  }

  return ...your application component;
}