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

如何通过PowerSync向Supabase正确上传jsonb类型数据?

解决PowerSync向Supabase上传jsonb类型数据的问题

问题根源

核心问题是PowerSync Schema定义的列类型与Supabase的jsonb列不匹配,加上参数传递的处理方式,导致数据被序列化为带转义符的字符串而非JSON结构:

  • Supabase端test_input为jsonb类型,但PowerSync Schema里定义成了Column.text,PowerSync会自动把传入的数组转为字符串存储。
  • 即便用jsonDecode转成数组,由于列类型是text,最终还是会被处理成带转义的字符串格式。

修复步骤

1. 修正PowerSync Schema的列类型

把schema.dart中test_input的列类型从Column.text改为Column.json,让PowerSync识别这是JSON类型字段,对应Supabase的jsonb:

Schema schema = Schema(([
  Table('table_name', [
    Column.json('test_input') // 替换原有的Column.text
  ]),
]));

2. 调整上传脚本的参数传递

直接传入原生数组对象(无需jsonDecode,除非你的输入是JSON字符串),PowerSync会自动将其序列化为符合jsonb要求的格式:

static Future<DetailForSync> updateDetailTest(
    List<String> test_input_flutter, String id_input) async {
  final results = await db.execute('''
    UPDATE table_name SET 
    test_input = ? 
    WHERE id = ? 
    RETURNING *
  ''', [
    // 直接传入数组,PowerSync会处理为JSON结构
    test_input_flutter,
    id_input
  ]);
  return DetailForSync(results.first);
}

如果是测试用的硬编码数据,直接传数组字面量即可:

["DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF", "ABCDEFAB-ABCD-ABCD-ABCD-ABCDEFABCDEF"]

3. 验证同步规则(可选)

确保PowerSync的同步规则中,test_input列被当作JSON类型同步而非文本。默认使用Column.json后会自动处理,但如果自定义了同步规则,需确认规则里没有强制转为字符串。

效果验证

修改完成后,Supabase的test_input列会存储为标准的jsonb数组格式:

["DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF", "ABCDEFAB-ABCD-ABCD-ABCD-ABCDEFABCDEF"]

内容的提问来源于stack exchange,提问作者Raven1987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:15:10