Files
supabase/apps/docs/content/guides/cli/seeding-your-database.mdx
T
Carel de WaalandCharis 56ee2a61f5 Docs: Updated seed generation guide (#28273)
* 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>
2024-08-01 09:36:09 +02:00

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:
![An example schema](/docs/img/guides/cli/snaplet-example-schema.png)
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)