Drizzle迁移创建视图失败,op-sqlite查询提示视图不存在
Drizzle迁移创建视图失败,op-sqlite查询提示视图不存在
这种问题我之前在Drizzle + op-sqlite的React Native项目里也踩过坑,咱们一步步拆解排查,应该能很快找到原因。
最可能的核心原因:SQL语法错误(strftime参数顺序搞反了)
你写的strftime(o.Date, '%d')是错误的!SQLite的strftime函数参数顺序是格式字符串在前,日期值在后,正确写法应该是strftime('%d', o.Date)。这个语法错误会导致创建视图的SQL执行失败,迁移过程中悄悄报错,最终视图根本没被创建出来。
你所有用到strftime的地方都要修正:
- 把
strftime(o.Date, '%d')改成strftime('%d', o.Date) strftime(o.Date, '%m')→strftime('%m', o.Date)strftime(o.Date, '%Y')→strftime('%Y', o.Date)- FundEntries部分的strftime也要做同样的修正
其他需要排查的点
1. 确认迁移是否真的执行成功
Drizzle会自动创建一个__drizzle_migrations表来记录已执行的迁移,你可以查询这个表,看看包含视图创建的迁移文件是否被标记为已完成。如果没找到对应的迁移记录,说明迁移根本没跑起来:
- 检查React Native环境下op-sqlite的迁移执行逻辑,是不是用对了
migrate()方法而不是db.push()? - 迁移执行时有没有加错误捕获?比如在代码里加try/catch,打印迁移的错误日志,很多时候迁移报错不会直接弹出来,得手动看日志。
2. 检查Drizzle对视图的迁移支持
虽然Drizzle支持视图定义,但有时候在特定适配器(比如op-sqlite)下,需要确保视图的创建语句被正确包含在迁移文件里:
- 你是用
drizzle-kit generate自动生成的迁移,还是手动写的?如果是自动生成的,确认Drizzle是否正确识别了你的视图定义并生成了对应的SQL。 - 有没有可能迁移配置里排除了视图相关的代码?检查
drizzle.config.ts里的设置。
3. 手动验证SQL正确性
把修正后的创建视图SQL复制到SQLite客户端(比如DB Browser for SQLite)里直接执行,看是否能成功创建视图。如果执行时报错,客户端会给出明确的错误提示,能帮你快速定位其他语法问题。
修复步骤总结
- 修正所有
strftime的参数顺序,确保格式字符串在前,日期列在后; - 更新迁移文件里的视图创建SQL(如果是自动生成的,重新跑
drizzle-kit generate); - 在React Native项目里重新执行迁移,同时加上错误捕获打印日志;
- 迁移完成后,用SQLite客户端检查数据库,确认
OperationListItems视图是否存在。
内容来源于stack exchange
相关产品推荐
相关产品推荐

