Drizzle ORM(expo-sqlite)


Drizzle ORM(expo-sqlite)

npx expo install expo-sqlite
npm i drizzle-orm
npm i -D drizzle-kit 迁移功能
官方基础用法
连接数据库

ts
import * as SQLite from 'expo-sqlite';
import { drizzle } from 'drizzle-orm/expo-sqlite';
const expo = SQLite.openDatabaseSync('db.db');
const db = drizzle(expo);

定义模型表

ts
import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core';

export const cards = sqliteTable('cards', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  front: text('front').notNull(),
  back: text('back'),
});

项目根目录创建metro.config.js

js
const { getDefaultConfig } = require('expo/metro-config');
/** @type {import('expo/metro-config').MetroConfig} */
const config = getDefaultConfig(__dirname);
config.resolver.sourceExts.push('sql');
module.exports = config;

更新项目根目录的babel.config.js

js
module.exports = function(api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
    plugins: [["inline-import", { "extensions": [".sql"] }]] // <-- add this
  };
};

app启动时自动创建表+增删改查

ts
// App.tsx
import { Text, View } from 'react-native';
import * as SQLite from 'expo-sqlite';
import { drizzle, sql } from 'drizzle-orm/expo-sqlite';
import { cards } from './db/schema';
import { useEffect, useState } from 'react';
import { eq } from 'drizzle-orm/expressions';   // WHERE 条件辅助

const sqlite = SQLite.openDatabaseSync('cards.db');
const db = drizzle(sqlite);

export default function App() {
  const [list, setList] = useState<typeof cards.$inferSelect[]>();

  /** 第一次运行时自动建表(IF NOT EXISTS 保证幂等) */
  useEffect(() => {
    (async () => {
      await db.run(sql`
        CREATE TABLE IF NOT EXISTS cards (
          id    INTEGER PRIMARY KEY AUTOINCREMENT,
          front TEXT NOT NULL,
          back  TEXT
        );
      `);

      /** ----------------- 增 (Insert) ----------------- */
      await db.insert(cards).values({ front: 'Hello', back: '你好' });

      /** ----------------- 改 (Update) ----------------- */
      await db
        .update(cards)
        .set({ back: '您好!' })
        .where(eq(cards.id, 1));

      /** ----------------- 查单条 (Select one) ---------- */
      const single = await db
        .select()
        .from(cards)
        .where(eq(cards.id, 1))
        .get();                       // 只拿一条
      console.log('单条记录', single);

      /** ----------------- 查多条 (Select many) --------- */
      const rows = await db.select().from(cards);
      setList(rows);

      /** ----------------- 删 (Delete) ------------------ */
      // await db.delete(cards).where(eq(cards.id, 1));
    })();
  }, []);

  /* --------- UI 演示 --------- */
  if (!list) return <Text>Loading…</Text>;
  if (list.length === 0) return <Text>Empty</Text>;

  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      {list.map((c) => (
        <Text key={c.id}>{c.front} → {c.back}</Text>
      ))}
    </View>
  );
}

gpt给的示例

ts
import * as SQLite from "expo-sqlite";
import { drizzle } from "drizzle-orm/expo-sqlite";

// 1. 打开 / 创建本地数据库
const sqlite = SQLite.openDatabaseSync("app.db");

// 2. 传给 Drizzle 得到 ORM 实例
export const db = drizzle(sqlite);

// 3. 定义 schema(最高效:单独放 schema.ts 并用 drizzle-kit 迁移)
import { int, text, sqliteTable } from "drizzle-orm/sqlite-core";

export const cards = sqliteTable("cards", {
  id: int("id").primaryKey({ autoIncrement: true }),
  front: text("front").notNull(),
  back: text("back"),
});

TypeORM

https://typeorm.io/docs/getting-started/
expo install expo-sqlite expo-sqlite 原生模块
npm install typeorm reflect-metadata --save TypeORM 主包 + 反射元数据
npm i expo-sqlite-storage expo-sqlite 封装

在第一个文件入口中导入例如App.ts
import "reflect-metadata"

初始化数据连接

ts
import { createConnection } from 'typeorm/browser';
import { Card } from './entities/Card';

// expo-sqlite-storage 自动被 TypeORM 调用
import 'expo-sqlite';          // 仅确保模块存在,无需代码

// 初始化含糊,与逆行会自动创建表
export const initDB = async () => {
  return await createConnection({
    type: 'expo',
    database: 'app.db',
    driver: require('expo-sqlite'),   // 指向驱动
    synchronize: true,                // ★ 首次/修改实体时自动建表 & ALTER
    logging: false,
    entities: [Card],
  });
};

定义模型

ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity('cards')
export class Card {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  front!: string;

  @Column({ nullable: true })
  back?: string;

  @Column({ default: 1 })              // 记忆等级
  lv!: number;
}

增删改查

ts
const conn = await initDB();            // 自动建表
const repo = conn.getRepository(Card);

/** --------- 增 (Create) --------- */
await repo.save({ front: 'Hello', back: '你好' });

/** --------- 改 (Update) --------- */
await repo.update({ id: 1 }, { lv: 2 });

/** --------- 查单条 (Read one) ---- */
const one = await repo.findOne({ where: { id: 1 } });
console.log('单条', one);

/** --------- 查多条 (Read many) --- */
const all = await repo.find();          // 全表
setCards(all);

/** --------- 删 (Delete) ---------- */
await repo.delete({ id: 1 });