You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:48:01