# Environment variables (Prisma ORM v7) (/docs/orm/v7/more/dev-environment/environment-variables)
> For the complete Prisma documentation index, see [llms.txt](https://www.prisma.io/docs/llms.txt). A markdown version of any docs page is available by appending `.md` to its URL.
Learn how to manage environment variables in your Prisma ORM project
Location: ORM > v7 > More > Dev environment > Environment variables
An environment variable is a key value pair of string data that is stored on your machine's local environment. Refer to our [Environment variables reference documentation](https://www.prisma.io/docs/orm/v7/reference/environment-variables-reference) for specific details.
Typically the name of the variable is uppercase, this is then followed by an equals sign then the value of the variable:
```text
MY_VALUE=prisma
```
The environment variable belongs to the environment where a process is running. Any program can read and create these environment variables. They are a cheap and effective way to store simple information.
> [!NOTE]
> With Prisma ORM v6.4.0, we released the `prisma.config.ts` file. This file allows you to manage your environment variables and settings in a more flexible way. [View our reference](https://www.prisma.io/docs/orm/v7/reference/prisma-config-reference) for more information.
## How Prisma ORM can use environment variables [#how-prisma-orm-can-use-environment-variables]
Prisma ORM always reads environment variables from the system's environment.
When you initialize Prisma ORM in your project with `prisma init`, it creates a convenience `.env` file for you to set your [`connection url`](https://www.prisma.io/docs/orm/v7/reference/connection-urls) as an environment variable. When you use Prisma CLI or Prisma Client, the `.env` file content and the variables defined in it are added to the [`process.env` object](https://nodejs.org/api/process.html#processenv), where Prisma ORM can read it and use it.
### Using an `.env` file [#using-an-env-file]
> [!WARNING]
> **Do not commit your `.env` files into version control**!
The Prisma CLI looks for `.env` files, in order, in the following locations:
1. In the root folder of your project (`./.env`)
2. From the same folder as the schema specified by the `--schema` argument
3. From the same folder as the schema taken from `"prisma": {"schema": "/path/to/schema.prisma"}` in `package.json`
4. From the `./prisma` folder
If a `.env` file is located in step 1., but additional, clashing `.env` variables are located in steps 2. - 4., the CLI will throw an error. For example, if you specify a `DATABASE_URL` variable in two different `.env` files, you will get the following error:
```
Error: There is a conflict between env vars in .env and prisma/.env
Conflicting env vars:
DATABASE_URL
We suggest to move the contents of prisma/.env to .env to consolidate your env vars.
```
The following table describes where the Prisma CLI looks for the `.env` file:
| **Command** | **schema location** | **`.env` file locations checked, in order** |
| :---------------------------------------------- | :--------------------------------------------------------------------------- | :-------------------------------------------------------- |
| `prisma [command]` | `./prisma/schema.prisma` | `./.env`
`./prisma/.env` |
| `prisma [command] --schema=./a/b/schema.prisma` | `./a/b/schema.prisma` | `./.env`
`./a/b/.env`
`./prisma/.env` |
| `prisma [command]` | `"prisma": {"schema": "/path/to/schema.prisma"}` | `.env`
`./path/to/schema/.env`
`./prisma/.env` |
| `prisma [command]` | No schema (for example, when running `prisma db pull` in an empty directory) | `./.env`
`./prisma/.env` |
Any environment variables defined in that `.env` file will automatically be loaded when running a Prisma CLI command.
> [!NOTE]
> To use more than one `.env` file, see [Using multiple `.env` files](#using-multiple-env-files) for how to set them up in your application.
Refer to the `dotenv` documentation for information about [what happens if an environment variable is defined in two places](https://www.npmjs.com/package/dotenv#what-happens-to-environment-variables-that-were-already-set).
#### Expanding variables with `.env` files [#expanding-variables-with-env-files]
Variables stored in `.env` files can be expanded using the format specified by [dotenv-expand](https://github.com/motdotla/dotenv-expand).
```text title=".env"
DATABASE_URL=postgresql://test:test@localhost:5432/test
DATABASE_URL_WITH_SCHEMA=${DATABASE_URL}?schema=public
```
Additionally, you can use environment variables in the expansion that are set *outside* of the `.env` file. For example a database URL that is set on a PaaS like Heroku or similar:
```bash
# environment variable already set in the environment of the system
export DATABASE_URL=postgresql://test:test@localhost:5432/test
```
```text title=".env"
DATABASE_URL_WITH_SCHEMA=${DATABASE_URL}?schema=foo
```
This will make the environment variable `DATABASE_URL_WITH_SCHEMA` with value `postgresql://test:test@localhost:5432/test?schema=foo` available for Prisma ORM.
### Using environment variables in your code [#using-environment-variables-in-your-code]
If you want environment variables to be evaluated at runtime, you need to load them manually in your application code (for example, by using [`dotenv`](https://github.com/motdotla/dotenv)):
```ts
import * as dotenv from "dotenv";
dotenv.config(); // Load the environment variables
console.log(`The connection URL is ${process.env.DATABASE_URL}`);
```
If you are using a custom file name for your environment variables, you can configure `dotenv` to use that filename:
```ts
import * as dotenv from "dotenv";
var envFile = path.resolve(join(__dirname, "myenv.env"));
dotenv.config({ path: envFile }); // Load the environment variables
console.log(`The connection URL is ${process.env.DATABASE_URL}`);
```
If you need variable expansion across environment files, you can additionally use [`dotenv-expand`](https://github.com/motdotla/dotenv-expand):
```ts
import * as dotenv from "dotenv";
const dotenvExpand = require("dotenv-expand");
var envFile = path.resolve(join(__dirname, "myenv.env"));
var mySqlEnv = dotenv.config({ path: envFile });
dotenvExpand.expand(mySqlEnv);
```
If you are using multiple `.env` files, you can reference an environment file in your project's code depending on the environment you are running in.
```ts
import { config } from "dotenv";
const envFile = process.env.NODE_ENV === "development" ? ".env.development" : ".env.production";
config({ path: envFile });
```
### Manually set environment variables [#manually-set-environment-variables]
Because Prisma ORM reads from the system's environment when looking for environment variables, it's possible to skip using `.env` completely and create them manually on your local system.
> [!NOTE]
> The following examples will use setting the `DATABASE_URL` environment variable which is often used for the database connection URL.
#### Manually set an environment variable on a Mac/Linux system [#manually-set-an-environment-variable-on-a-maclinux-system]
From a terminal on a Unix machine (Mac/Linux), you export the variable as a key value pair.
```bash
export DATABASE_URL=postgresql://test:test@localhost:5432/test?schema=public
```
Then check that it has been successfully set using `printenv`:
```bash
printenv DATABASE_URL
```
```text no-copy
postgresql://test:test@localhost:5432/test?schema=public
```
#### Manually set an environment variable on a Windows system [#manually-set-an-environment-variable-on-a-windows-system]
The following examples illustrate how to set the environment variable (for the current user) using both Command Prompt (`cmd.exe`) and PowerShell, depending on your preference.
#### Command Prompt
```bash
set "DATABASE_URL=postgresql://test:test@localhost:5432/test?schema=public"
```
#### PowerShell
```bash
[Environment]::SetEnvironmentVariable("DATABASE_URL", "postgresql://test:test@localhost:5432/test?schema=public")
```
Then check that it has been successfully set:
#### Command Prompt
```bash
set DATABASE_URL
```
#### PowerShell
```bash
Get-ChildItem Env:DATABASE_URL
```
### Using multiple `.env` files [#using-multiple-env-files]
There is a risk that your production database could be deleted if you store different connection URLs to each of your environments within a single `.env` file.
One solution is to have multiple `.env` files which each represent different environments. In practice, this means you create a file for each of your environments:
* `.env.development`
* `.env.sample`
Then using a package like [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli), you can load the correct connection URL for the environment you are working in.
> [!NOTE]
> For our purposes, it is assumed you have a dedicated development database that you use while developing your application.
1. Rename your `.env` file to `.env.development`
```text title=".env.development"
DATABASE_URL="postgresql://prisma:prisma@localhost:5433/dev"
```
2. Create a new `.env.sample` file and change the database name to `sample` (or your preferred name)
```text title=".env.sample"
DATABASE_URL="postgresql://prisma:prisma@localhost:5433/sample"
```
3. Install [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli)
In order for Prisma ORM and Jest to know which `.env` file to use, alter your `package.json` scripts to include and call the `dotenv` package and specify which file to use depending on what commands you are running and in which environment you want them to run.
> [!NOTE]
> Any top-level script that is running the tests and migrations needs the `dotenv` command before it. This makes sure that the env variables from `.env.sample` are passed to all commands, including Jest.
#### Running migrations on different environments [#running-migrations-on-different-environments]
You can use the [`dotenv-cli`](https://www.npmjs.com/package/dotenv-cli) package to specify which environment file Prisma ORM should use when running a migration.
The below script uses `dotenv-cli` to pass the `.env.sample` environment file (which holds a `DATABASE_URL` connection string) to the Prisma ORM migration script.
#### Migration script [#migration-script]
```json title="package.json"
"scripts": {
"migrate:postgres": "dotenv -e .env.sample -- npx prisma migrate deploy",
},
```
#### Running tests on different environments [#running-tests-on-different-environments]
When running tests, we advise you to [mock Prisma Client](https://www.prisma.io/docs/orm/v7/prisma-client/testing/unit-testing#mocking-prisma-client). In doing so, you need to tell Jest which environment it should use when running its tests.
By default, Prisma Client will use the environment specified in the default `.env` file located at the project's root.
If you have created a separate `.env.sample` file to specify your testing database, then this environment will need to be passed to Jest.
The below script uses `dotenv-cli` to pass the `.env.sample` environment file (which holds a `DATABASE_URL` connection string) to Jest.
```json title="package.json"
"scripts": {
"test": "dotenv -e .env.sample -- jest -i"
},
```
## Related pages
- [`Editor setup`](https://www.prisma.io/docs/orm/v7/more/dev-environment/editor-setup): Learn how to configure your editor and IDEs for syntax highlighting, autocompletion, and formatting with Prisma ORM