如何通过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
相关产品推荐
相关产品推荐

