mirror of
https://github.com/supabase/supabase.git
synced 2026-10-15 06:09:08 +03:00
* Change Snaplet link to Github repo Updated guide to reflect Snaplet seed changes Mention tips for users that do not have an ORM setup Added Snaplet to accept.txt file * Add npm to accept.txt * Adding mdx formating suggestions from code review --------- Co-authored-by: Charis <26616127+charislam@users.noreply.github.com>
171 lines
5.9 KiB
Plaintext
171 lines
5.9 KiB
Plaintext
---
|
|
id: 'seeding-your-database'
|
|
title: 'Seeding your database'
|
|
description: 'Populate your database with initial data for reproducible environments across local and testing.'
|
|
subtitle: 'Populate your database with initial data for reproducible environments across local and testing.'
|
|
---
|
|
|
|
When you run `supabase init` we create an empty `seed.sql` file in the root of the `supabase` folder. You can use this to populate your database with seed data.
|
|
|
|
## What is seed data?
|
|
|
|
Seeding is the process of populating a database with initial data, typically used to provide sample or default records for testing and development purposes. You can use this to create "reproducible environments" for local development, staging, and production.
|
|
|
|
## Using the seed file
|
|
|
|
The `seed.sql` file is run every time you run `supabase start` or `supabase db reset`. Seeding is done _after_ all the database migrations have been run. As a general rule, you should not add schema statements to your seed file, only data.
|
|
|
|
You can add any SQL statements to this file. For example:
|
|
|
|
```sql supabase/seed.sql
|
|
insert into countries
|
|
(name, code)
|
|
values
|
|
('United States', 'US'),
|
|
('Canada', 'CA'),
|
|
('Mexico', 'MX');
|
|
```
|
|
|
|
{/* prettier-ignore */}
|
|
{/*
|
|
|
|
### Splitting up your seed file
|
|
|
|
The seed file can grow quite large, so you can split it up into multiple files. For example, you can create a `seed` folder and add a `countries.sql` file. Then you can add the following to your `seed.sql` file.
|
|
|
|
```sql supabase/seed.sql
|
|
\i seed/countries.sql
|
|
```
|
|
|
|
### Using CSV data to seed your database
|
|
|
|
co
|
|
You can use the `COPY` command to import CSV data into your database. For example, you can create a `seed` folder and add a `countries.csv` file. Then you can add the following to your `seed.sql` file.
|
|
|
|
```sql supabase/seed.sql
|
|
COPY countries (name, code) FROM 'seed/countries.csv' WITH (FORMAT csv);
|
|
```
|
|
|
|
\*/}
|
|
|
|
## Generating seed data
|
|
|
|
You can generate seed data for local development using [Snaplet](https://github.com/snaplet/seed).
|
|
|
|
<Admonition type="tip">
|
|
|
|
To use Snaplet, you need to have Node.js and npm installed. You can add Node.js to your project by running `npm init -y` in your project directory.
|
|
|
|
</Admonition>
|
|
|
|
If this is your first time using Snaplet to seed your project, you'll need to set up Snaplet with the following command:
|
|
|
|
```bash
|
|
npx @snaplet/seed init
|
|
```
|
|
|
|
This command will analyze your database and its structure, and then generate a JavaScript client which can be used to define exactly how your data should be generated using code. The `init` command generates a configuration file, `seed.config.ts` and an example script, `seed.ts`, as a starting point.
|
|
|
|
<Admonition type="tip">
|
|
|
|
During `init` if you are not using an Object Relational Mapper (ORM) or your ORM is not in the supported list, choose `node-postgres`.
|
|
|
|
</Admonition>
|
|
|
|
In most cases you only want to generate data for specific schemas or tables. This is defined with `select`. Here is an example `seed.config.ts` configuration file:
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
adapter: async () => {
|
|
const client = new Client({
|
|
connectionString: 'postgresql://postgres:postgres@localhost:54322/postgres',
|
|
})
|
|
await client.connect()
|
|
return new SeedPg(client)
|
|
},
|
|
// We only want to generate data for the public schema
|
|
select: ['!*', 'public.*'],
|
|
})
|
|
```
|
|
|
|
Suppose you have a database with the following schema:
|
|
|
|

|
|
|
|
You can use the seed script example generated by Snaplet `seed.ts` to define the values you want to generate. For example:
|
|
|
|
- A `Post` with the title `"There is a lot of snow around here!"`
|
|
- The `Post.createdBy` user with an email address ending in `"@acme.org"`
|
|
- Three `Post.comments` from three different users.
|
|
|
|
```ts seed.ts
|
|
import { createSeedClient } from '@snaplet/seed'
|
|
import { copycat } from '@snaplet/copycat'
|
|
|
|
async function main() {
|
|
const seed = await createSeedClient({ dryRun: true })
|
|
|
|
await seed.Post([
|
|
{
|
|
title: 'There is a lot of snow around here!',
|
|
createdBy: {
|
|
email: (ctx) =>
|
|
copycat.email(ctx.seed, {
|
|
domain: 'acme.org',
|
|
}),
|
|
},
|
|
Comment: (x) => x(3),
|
|
},
|
|
])
|
|
|
|
process.exit()
|
|
}
|
|
|
|
main()
|
|
```
|
|
|
|
Running `npx tsx seed.ts > supabase/seed.sql` generates the relevant SQL statements inside your `supabase/seed.sql` file:
|
|
|
|
```sql
|
|
-- The `Post.createdBy` user with an email address ending in `"@acme.org"`
|
|
INSERT INTO "User" (name, email) VALUES ("John Snow", "snow@acme.org")
|
|
|
|
--- A `Post` with the title `"There is a lot of snow around here!"`
|
|
INSERT INTO "Post" (title, content, createdBy) VALUES (
|
|
"There is a lot of snow around here!",
|
|
"Lorem ipsum dolar",
|
|
1)
|
|
|
|
--- Three `Post.Comment` from three different users.
|
|
INSERT INTO "User" (name, email) VALUES ("Stephanie Shadow", "shadow@domain.com")
|
|
INSERT INTO "Comment" (text, userId, postId) VALUES ("I love cheese", 2, 1)
|
|
|
|
INSERT INTO "User" (name, email) VALUES ("John Rambo", "rambo@trymore.dev")
|
|
INSERT INTO "Comment" (text, userId, postId) VALUES ("Lorem ipsum dolar sit", 3, 1)
|
|
|
|
INSERT INTO "User" (name, email) VALUES ("Steven Plank", "s@plank.org")
|
|
INSERT INTO "Comment" (text, userId, postId) VALUES ("Actually, that's not correct...", 4, 1)
|
|
```
|
|
|
|
Whenever your database structure changes, you will need to regenerate `@snaplet/seed` to keep it in sync with the new structure. You can do this by running:
|
|
|
|
```bash
|
|
npx @snaplet/seed sync
|
|
```
|
|
|
|
You can further enhance your seed script by using Large Language Models to generate more realistic data. To enable this feature, set one of the following environment variables in your `.env` file:
|
|
|
|
```plaintext
|
|
OPENAI_API_KEY=<your_openai_api_key>
|
|
GROQ_API_KEY=<your_groq_api_key>
|
|
```
|
|
|
|
After setting the environment variables, run the following commands to sync and generate the seed data:
|
|
|
|
```bash
|
|
npx @snaplet/seed sync
|
|
npx tsx seed.ts > supabase/seed.sql
|
|
```
|
|
|
|
For more information, check out Snaplet's [seed documentation](https://docs.snaplet.dev/seed/integrations/supabase)
|