How to Connect Supabase Database in Cursor
Set up a Supabase Postgres database in your Cursor project with type-safe queries, migrations, and AI-generated data layers.
Before you start
- ✓Cursor IDE installed
- ✓A Supabase account
- ✓A Next.js or Node.js project open in Cursor
Step by step
Install the Supabase client
Open Cursor's terminal and install the Supabase JS client library.
npm install @supabase/supabase-js
Create your environment variables
Create a .env.local file in your project root with your Supabase credentials.
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbG...your-key SUPABASE_SERVICE_ROLE_KEY=eyJhbG...your-service-key
Generate a typed Supabase client
Use Cursor's AI to create a properly typed client that matches your database schema.
Paste this into Cursor:
Create a lib/supabase.ts file that: 1. Creates a Supabase client using createClient from @supabase/supabase-js 2. Exports it as a named export 3. Uses environment variables for the URL and anon key 4. Add a separate createServerClient for server-side usage with the service role key
Generate TypeScript types from your schema
Use the Supabase CLI to auto-generate TypeScript types from your database schema.
npx supabase gen types typescript --project-id your-project-id > src/types/database.ts
Build your data access layer
Ask Cursor to generate functions for all your CRUD operations, using the generated types.
Paste this into Cursor:
Using the Database types from src/types/database.ts and the Supabase client from lib/supabase.ts, create a data access layer in lib/db.ts with: 1. getAllPosts() - fetches all posts ordered by created_at desc 2. getPostById(id) - fetches a single post 3. createPost(data) - inserts a new post 4. updatePost(id, data) - updates a post 5. deletePost(id) - deletes a post All functions should be fully typed and handle errors.
Create a database migration
Define your schema in SQL and run it via the Supabase dashboard or CLI.
-- In Supabase SQL Editor: CREATE TABLE posts ( id uuid DEFAULT gen_random_uuid() PRIMARY KEY, title text NOT NULL, content text, user_id uuid REFERENCES auth.users(id), created_at timestamptz DEFAULT now() ); ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
Common errors
TypeError: supabase.from is not a function
The Supabase client wasn't initialized correctly.
Fix: Make sure you're calling createClient with two arguments: the URL and the key.
Row Level Security is enabled but no policies allow access.
Fix: Create RLS policies that match your access patterns. Start with a policy allowing authenticated users to read all rows.
Types out of sync with database
Your TypeScript types don't match the actual database schema.
Fix: Re-run npx supabase gen types typescript to regenerate types after schema changes.