Bird
Raised Fist0
Supabasecloud~5 mins

Subscribing to database changes in Supabase

Choose your learning style10 modes available
Introduction

Subscribing to database changes lets your app know when data updates happen. This helps keep your app data fresh without asking the database again and again.

You want to show live chat messages as they arrive.
You need to update a dashboard when new sales happen.
You want to notify users instantly when their data changes.
You are building a collaborative app where many users edit data.
You want to reduce repeated database requests by listening to changes.
Syntax
Supabase
const subscription = supabase
  .from('table_name')
  .on('INSERT', payload => {
    console.log('New row:', payload.new)
  })
  .subscribe()

Replace 'table_name' with your actual database table name.

Events can be 'INSERT', 'UPDATE', or 'DELETE' depending on what changes you want to listen for.

Examples
Listen for new rows added to the 'messages' table and log them.
Supabase
const subscription = supabase
  .from('messages')
  .on('INSERT', payload => {
    console.log('New message:', payload.new)
  })
  .subscribe()
Listen for updates to rows in the 'orders' table.
Supabase
const subscription = supabase
  .from('orders')
  .on('UPDATE', payload => {
    console.log('Order updated:', payload.new)
  })
  .subscribe()
Listen for deleted rows in the 'tasks' table and log the old data.
Supabase
const subscription = supabase
  .from('tasks')
  .on('DELETE', payload => {
    console.log('Task deleted:', payload.old)
  })
  .subscribe()
Sample Program

This example connects to Supabase, subscribes to new rows inserted into the 'messages' table, and logs the new message data.

Supabase
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = 'https://xyzcompany.supabase.co'
const supabaseKey = 'public-anonymous-key'
const supabase = createClient(supabaseUrl, supabaseKey)

const subscription = supabase
  .from('messages')
  .on('INSERT', payload => {
    console.log('New message received:', payload.new)
  })
  .subscribe()

// To stop listening later:
// supabase.removeSubscription(subscription)
OutputSuccess
Important Notes

Always remove subscriptions when no longer needed to avoid memory leaks.

Payload contains 'new' for INSERT/UPDATE and 'old' for DELETE events.

Make sure your Supabase project has real-time enabled for the tables you subscribe to.

Summary

Subscribing to database changes keeps your app data live and fresh.

Use .from('table').on('EVENT', callback).subscribe() to listen for changes.

Remember to clean up subscriptions when done.

Practice

(1/5)
1. What does subscribing to database changes in Supabase help your app do?
easy
A. Keep app data live and updated automatically
B. Manually refresh data by reloading the page
C. Store data permanently on the client device
D. Encrypt data before sending to the database

Solution

  1. Step 1: Understand the purpose of subscriptions

    Subscriptions listen for database changes and update the app data live.
  2. Step 2: Compare options with subscription benefits

    Only Keep app data live and updated automatically describes automatic live updates, matching subscription behavior.
  3. Final Answer:

    Keep app data live and updated automatically -> Option A
  4. Quick Check:

    Subscriptions = live data updates [OK]
Hint: Subscriptions keep data live without manual refresh [OK]
Common Mistakes:
  • Thinking subscriptions store data locally
  • Confusing subscriptions with manual refresh
  • Assuming subscriptions encrypt data
2. Which of the following is the correct syntax to subscribe to INSERT events on the 'messages' table in Supabase?
easy
A. supabase.from('messages').on('UPDATE', callback).subscribe()
B. supabase.from('messages').on('INSERT', callback).subscribe()
C. supabase.table('messages').listen('INSERT', callback).subscribe()
D. supabase.listen('messages').on('INSERT', callback).subscribe()

Solution

  1. Step 1: Recall correct Supabase subscription syntax

    The correct method is supabase.from('table').on('EVENT', callback).subscribe().
  2. Step 2: Match syntax to options

    supabase.from('messages').on('INSERT', callback).subscribe() matches this syntax with 'messages' and 'INSERT' event.
  3. Final Answer:

    supabase.from('messages').on('INSERT', callback).subscribe() -> Option B
  4. Quick Check:

    Correct syntax = supabase.from('messages').on('INSERT', callback).subscribe() [OK]
Hint: Use .from('table').on('EVENT', callback).subscribe() [OK]
Common Mistakes:
  • Using .table() instead of .from()
  • Listening to wrong event type
  • Incorrect method chaining order
3. Given the code below, what will be logged when a new row is inserted into the 'tasks' table?
supabase.from('tasks').on('INSERT', payload => {
  console.log('New task:', payload.new);
}).subscribe()
medium
A. New task: undefined
B. No output because subscription is missing
C. Error: callback not defined
D. New task: [object Object] with new row data

Solution

  1. Step 1: Understand the callback payload on INSERT

    The payload contains a 'new' property with the inserted row data as an object.
  2. Step 2: Analyze console.log output

    Logging 'New task:' plus payload.new prints the object as '[object Object]' in console.
  3. Final Answer:

    New task: [object Object] with new row data -> Option D
  4. Quick Check:

    Payload.new logs inserted row object [OK]
Hint: payload.new holds inserted row data object [OK]
Common Mistakes:
  • Expecting payload.new to be undefined
  • Confusing payload.new with payload.old
  • Assuming subscription needs extra setup to log
4. What is wrong with this subscription code?
const subscription = supabase.from('orders').on('DELETE', () => {
  console.log('Order deleted');
})
medium
A. Missing .subscribe() call to activate subscription
B. Wrong event type; should be 'REMOVE' instead of 'DELETE'
C. Callback function must receive a payload parameter
D. Subscription must be assigned to a variable named 'sub'

Solution

  1. Step 1: Check subscription activation

    The .subscribe() method is required to start listening to events.
  2. Step 2: Verify event type and callback

    'DELETE' is a valid event, and callback can omit payload if unused.
  3. Final Answer:

    Missing .subscribe() call to activate subscription -> Option A
  4. Quick Check:

    Always call .subscribe() to activate [OK]
Hint: Always end with .subscribe() to start listening [OK]
Common Mistakes:
  • Forgetting .subscribe() call
  • Using wrong event names
  • Thinking callback must have parameters
5. You want to subscribe to both INSERT and UPDATE events on the 'profiles' table and log the changed row each time. Which code correctly achieves this?
hard
A. supabase.from('profiles').on('INSERT,UPDATE', payload => console.log(payload.new)).subscribe()
B. supabase.from('profiles').on(['INSERT', 'UPDATE'], payload => console.log(payload.new)).subscribe()
C. supabase.from('profiles').on('INSERT', payload => console.log(payload.new)).on('UPDATE', payload => console.log(payload.new)).subscribe()
D. supabase.from('profiles').on('INSERT').on('UPDATE', payload => console.log(payload.new)).subscribe()

Solution

  1. Step 1: Understand event subscription chaining

    Supabase allows chaining .on() calls for different events before .subscribe().
  2. Step 2: Evaluate each option's syntax

    supabase.from('profiles').on('INSERT', payload => console.log(payload.new)).on('UPDATE', payload => console.log(payload.new)).subscribe() chains .on('INSERT', ...).on('UPDATE', ...) correctly; others use invalid event formats.
  3. Final Answer:

    supabase.from('profiles').on('INSERT', payload => console.log(payload.new)).on('UPDATE', payload => console.log(payload.new)).subscribe() -> Option C
  4. Quick Check:

    Chain .on() for multiple events [OK]
Hint: Chain .on() calls for each event before .subscribe() [OK]
Common Mistakes:
  • Trying to pass multiple events as array or comma string
  • Calling .subscribe() too early
  • Not chaining .on() properly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard