在Expo-SQLite结合TypeORM的项目中定义REGEX/REGEXP函数的方法
在Expo-SQLite结合TypeORM的项目中定义REGEX/REGEXP函数的方法
嘿,我知道你现在在Expo-SQLite搭配TypeORM的项目里,想在数据库查询里用正则匹配的REGEXP函数对吧?这事儿不难,我给你一步步说清楚怎么弄~
首先得明白:SQLite本身没有内置REGEXP函数,所以得咱们自己手动注册一个,然后才能在TypeORM的查询里正常使用它。
第一步:初始化数据源后注册REGEXP函数
你已经有了TypeORM的DataSource配置,接下来要在数据源初始化完成后,用Expo-SQLite的API注册自定义的REGEXP函数。具体代码可以这么写:
import * as SQLite from 'expo-sqlite'; import { DataSource } from 'typeorm'; // 记得替换成你自己的实体类 import { YourEntity } from './entities/YourEntity'; // 先定义你的数据源 const AppDataSource = new DataSource({ database: 'db-name', type: 'expo', driver: SQLite, entities: [YourEntity], synchronize: true, logging: 'all', }); // 封装初始化逻辑,顺便注册REGEXP函数 async function setupDatabase() { try { // 先初始化TypeORM的数据源 await AppDataSource.initialize(); console.log('TypeORM数据源初始化成功'); // 获取Expo-SQLite的数据库实例 const db = SQLite.openDatabase('db-name'); // 注册REGEXP函数——这里用SQLite支持的语法,内部依赖JS的正则实现 db.exec({ sql: `CREATE FUNCTION IF NOT EXISTS REGEXP(expr, str) RETURNS INTEGER BEGIN RETURN str REGEXP expr; END;`, args: [], callback: (error) => { if (error) { console.error('REGEXP函数注册失败:', error); } else { console.log('REGEXP函数注册成功啦!'); } } }); } catch (error) { console.error('数据库初始化失败:', error); } } // 调用这个初始化函数,一般在App启动的时候执行 setupDatabase();
第二步:在TypeORM查询中使用REGEXP函数
注册好之后,不管是用QueryBuilder还是直接写SQL查询,都能正常用REGEXP了。举两个例子:
用QueryBuilder的方式
async function searchEntitiesWithRegex() { const entityRepo = AppDataSource.getRepository(YourEntity); // 这里的pattern就是你要的正则表达式,比如匹配以"test"开头的内容 const matchedEntities = await entityRepo .createQueryBuilder('entity') .where('entity.target_column REGEXP :pattern', { pattern: '^test.*$' }) .getMany(); return matchedEntities; }
直接执行SQL的方式
async function rawSearchWithRegex() { const matchedEntities = await AppDataSource.manager.query( 'SELECT * FROM your_entity_table WHERE target_column REGEXP ?', ['^test.*$'] ); return matchedEntities; }
一些要注意的小细节
- 一定要等TypeORM的数据源初始化完成后,再注册REGEXP函数,不然会出现数据库连接还没准备好的问题。
- 注册函数的时候用
CREATE FUNCTION IF NOT EXISTS,这样就算重复执行初始化逻辑,也不会报错。 - 函数的参数顺序别搞反:第一个是正则表达式,第二个是要匹配的字段内容。
备注:内容来源于stack exchange,提问作者Ahmed Afifi
相关产品推荐
相关产品推荐

