Drizzle联表查询结果字段类型不匹配问题求助
问题排查:SQLite + Bun + bun:sqlite 查询结果字段类型与键不匹配
问题场景
执行以下查询时,返回结果出现字段类型与字典键不匹配的混乱情况:
const results = await db.select().from(tweets).where(sql`${tweets.response} is null`) .innerJoin(users, eq(users.twitter_id, tweets.authorId))
示例异常结果:
{ "tweets": { "id": 134123442, "twitter_id": 0, "created_at": "None", "authorId": 0, "is_retweet": false, "retweetedTweetId": false, "is_quoted": false, "quotedTweetId": 2, "is_reply": false, "reply_counts": 17 ... } }
可能的原因及解决方向
- bun:sqlite类型映射逻辑偏差:SQLite是弱类型数据库,bun:sqlite在将查询结果转为JS对象时,可能对NULL、整数、布尔值的推断出错。比如
retweetedTweetId应为可空整数,却被解析为布尔值,大概率是数据库中该字段为NULL/0时,bun的转换逻辑误判。 - 表结构与代码schema定义不匹配:如果
tweets表中retweetedTweetId是可空整数,但代码里的模型schema未标记为可空,bun会用默认值(如false)填充NULL值,导致类型混乱。检查代码中的表结构定义,确保字段可空性与数据库一致。 - JOIN操作引发的映射异常:JOIN后结果集包含两张表的字段,若存在同名字段(即使当前示例没有)会导致字段覆盖;另外,JOIN后的结果集字段顺序或解析逻辑可能出现偏差,影响对象映射。可以尝试单独查询
tweets表,看是否还存在类型问题,排查是否是JOIN导致的。 - bun版本存在已知bug:部分旧版本的bun或bun:sqlite存在类型映射bug,建议升级到最新稳定版,验证问题是否解决。
- 手动SQL拼接的潜在问题:使用
sql模板字符串写WHERE条件,可能存在隐式类型转换异常。建议改用ORM提供的isNull方法,比如where(isNull(tweets.response)),避免手动拼接SQL带来的解析问题。
内容的提问来源于stack exchange,提问作者enzo
相关产品推荐
相关产品推荐

