六维教程

Supabase 数据增删改

上一篇学会了读,这一篇学写。插入、更新、删除三大操作,代码模式都非常统一,重点在于理解操作背后的安全问题。

插入数据

用 .insert() 插入一条数据,参数是一个对象

const { data, error } = await supabase
  .from('profiles')
  .insert({
    id: '33333333-3333-3333-3333-333333333333',
    username: '小刚',
    age: 22
  })

一次插入多条,传入数组

const { data, error } = await supabase
  .from('profiles')
  .insert([
    { id: '44444444-4444-4444-4444-444444444444', username: '小丽' },
    { id: '55555555-5555-5555-5555-555555555555', username: '小强' }
  ])

默认情况下 insert 不返回插入的数据,结尾加 .select() 让它返回

const { data } = await supabase
  .from('profiles')
  .insert({ username: '小刚', age: 22 })
  .select()

注意缺省的列,比如 created_at 和 is_vip,会由数据库按默认值自动填充,这正是上一篇建表时定义默认值的作用。

更新数据

更新必须搭配条件,否则会把整张表都改掉。写法是先写新值,再用 .eq() 定位行

const { data, error } = await supabase
  .from('profiles')
  .update({ age: 23 })
  .eq('id', '33333333-3333-3333-3333-333333333333')

.id(‘’) 这种写法不存在,所有条件都必须通过 .eq() 这类方法指定。只更新传入的字段,其他字段保持原值。

删除数据

删除同样必须带条件

const { data, error } = await supabase
  .from('profiles')
  .delete()
  .eq('id', '33333333-3333-3333-3333-333333333333')

删除是不可逆操作,上线项目里建议在表上加 is_deleted 字段做软删除,需要时再查出来,这里先了解概念。

增删改查一表通

四种操作放在一起看,模式非常统一,前缀是操作类型,后缀是筛选条件

操作 方法 关键点
.select() 不加条件就是全表
.insert() 可加 .select() 返回新数据
.update() 必须加 .eq() 条件
.delete() 必须加 .eq() 条件

谁说能改

到目前为止,所有操作都是直接拿 anon key 调用的,而 anon key 是公开的,任何访问你网站的人都能拿到。这意味着任何人打开浏览器控制台,都能执行一段代码往你的表里插数据,或者把别人的资料改掉。

这不是危言耸听,只要不设防,你的数据库就是全裸的。注册登录(第六、七篇)解决的是”你是谁”,行级安全策略(第八篇)解决的是”你能动哪些行”,两者缺一不可。

下一篇学习用户认证,先解决”你是谁”的问题。

下一篇 Supabase 用户认证入门

上一篇
Supabase 数据查询入门
下一篇
Supabase 用户认证入门