Drizzle <> Expo SQLite
根据 官方网站,Expo 是一个用于开发、构建和发布 React Native 应用程序的工具生态系统。 它由 Hermes JavaScript 运行时和 Metro 打包器提供支持,Drizzle Expo 驱动程序旨在原生支持这两者。
Drizzle ORM 为 Expo SQLite 提供了同类最佳工具包:
- Expo SQLite 的原生 ORM 驱动程序 ✅
- Drizzle Kit 支持在应用中生成和打包迁移 ✅
- Drizzle Studio 开发工具插件,用于浏览设备上的数据库 ✅
- 实时查询 ✅
npm
yarn
pnpm
bun
npm i drizzle-orm@rc expo-sqlite@next
npm i -D drizzle-kit@rc
import { drizzle } from "drizzle-orm/expo-sqlite";
import { openDatabaseSync } from "expo-sqlite";
const expo = openDatabaseSync("db.db");
const db = drizzle(expo);
await db.select().from(users);实时查询
使用 useLiveQuery 钩子,您可以使任何 Drizzle 查询变为响应式:
import { useLiveQuery, drizzle } from 'drizzle-orm/expo-sqlite';
import { openDatabaseSync } from 'expo-sqlite';
import { Text } from 'react-native';
import * as schema from './schema';
const expo = openDatabaseSync('db.db', { enableChangeListener: true }); // <-- 启用更改监听器
const db = drizzle(expo);
const App = () => {
// 当数据更改时自动重新渲染
const { data } = useLiveQuery(db.select().from(schema.users));
return <Text>{JSON.stringify(data)}</Text>;
};
export default App;使用 Drizzle Kit 进行 Expo SQLite 迁移
您可以使用 Drizzle Kit 生成 SQL 迁移。
在继续之前,请务必先了解 Drizzle migrations 的工作方式。
Expo / React Native 要求您将 SQL 迁移打包进应用,我们已经为您准备好了。
安装 babel 插件
必须将 SQL 迁移文件作为字符串直接打包到您的包中。
npm install babel-plugin-inline-import更新配置文件。
您需要更新 babel.config.js、metro.config.js 和 drizzle.config.ts 文件
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
plugins: [["inline-import", { "extensions": [".sql"] }]] // <-- 添加此项
};
};const { getDefaultConfig } = require('expo/metro-config');
/** @type {import('expo/metro-config').MetroConfig} */
const config = getDefaultConfig(__dirname);
config.resolver.sourceExts.push('sql'); // <--- 添加此项
module.exports = config;确保在 Drizzle Kit 配置中设置 dialect: 'sqlite' 和 driver: 'expo'
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 钩子中按您希望的方式进行。
import { drizzle } from "drizzle-orm/expo-sqlite";
import { openDatabaseSync } from "expo-sqlite";
import { useMigrations } from 'drizzle-orm/expo-sqlite/migrator';
import migrations from './drizzle/migrations';
const expoDb = openDatabaseSync("db.db");
const db = drizzle(expoDb);
export default function App() {
const { success, error } = useMigrations(db, migrations);
if (error) {
return (
<View>
<Text>迁移错误: {error.message}</Text>
</View>
);
}
if (!success) {
return (
<View>
<Text>迁移正在进行中...</Text>
</View>
);
}
return ...你的应用组件;
}