Postgres

To use Payload with Postgres, install the package @payloadcms/db-postgres. It leverages Drizzle ORM and node-postgres to interact with a Postgres database that you provide.

Alternatively, the @payloadcms/db-vercel-postgres package is also available and is optimized for use with Vercel.

It automatically manages changes to your database for you in development mode, and exposes a full suite of migration controls for you to leverage in order to keep other database environments in sync with your schema. DDL transformations are automatically generated.

To configure Payload to use Postgres, pass the postgresAdapter to your Payload Config as follows:

Usage

@payloadcms/db-postgres:

1
import { postgresAdapter } from '@payloadcms/db-postgres'
2
3
export default buildConfig({
4
// Configure the Postgres adapter here
5
db: postgresAdapter({
6
// Postgres-specific arguments go here.
7
// `pool` is required.
8
pool: {
9
connectionString: process.env.DATABASE_URI,
10
},
11
}),
12
})

@payloadcms/db-vercel-postgres:

1
import { vercelPostgresAdapter } from '@payloadcms/db-vercel-postgres'
2
3
export default buildConfig({
4
// Automatically uses proces.env.POSTGRES_URL if no options are provided.
5
db: vercelPostgresAdapter(),
6
// Optionally, can accept the same options as the @vercel/postgres package.
7
db: vercelPostgresAdapter({
8
pool: {
9
connectionString: process.env.DATABASE_URL
10
},
11
}),
12
})

Options

OptionDescription
pool *Pool connection options that will be passed to Drizzle and node-postgres or to @vercel/postgres
pushDisable Drizzle's db push in development mode. By default, push is enabled for development mode only.
migrationDirCustomize the directory that migrations are stored.
schemaName (experimental)A string for the postgres schema to use, defaults to 'public'.
idTypeA string of 'serial', or 'uuid' that is used for the data type given to id columns.
transactionOptionsA PgTransactionConfig object for transactions, or set to false to disable using transactions. More details
localesSuffixA string appended to the end of table names for storing localized fields. Default is '_locales'.
relationshipsSuffixA string appended to the end of table names for storing relationships. Default is '_rels'.
versionsSuffixA string appended to the end of table names for storing versions. Defaults to '_v'.

Access to Drizzle

After Payload is initialized, this adapter will expose the full power of Drizzle to you for use if you need it.

You can access Drizzle as follows:

1
payload.db.drizzle

Tables, relations, and enums

In addition to exposing Drizzle directly, all of the tables, Drizzle relations, and enum configs are exposed for you via the payload.db property as well.

  • Tables - payload.db.tables
  • Enums - payload.db.enums
  • Relations - payload.db.relations

Prototyping in development mode

Drizzle exposes two ways to work locally in development mode.

The first is db push, which automatically pushes changes you make to your Payload Config (and therefore, Drizzle schema) to your database so you don't have to manually migrate every time you change your Payload Config. This only works in development mode, and should not be mixed with manually running migrate commands.

You will be warned if any changes that you make will entail data loss while in development mode. Push is enabled by default, but you can opt out if you'd like.

Alternatively, you can disable push and rely solely on migrations to keep your local database in sync with your Payload Config.

Migration workflows

In Postgres, migrations are a fundamental aspect of working with Payload and you should become familiar with how they work.

For more information about migrations, click here.

Next

SQLite