Goals
On this page, you will learn how to:
- Install the Prisma CLI
- Set up Prisma using Docker
- Introspect your existing database and derive a datamodel
- Use the datamodel to configure your Prisma API
- Generate a Prisma client
- Read and write data using the Prisma client
Using your existing database with Prisma currently only works when using PostgreSQL databases.
Prerequisites
Make sure to have connection details for your database at hand. This includes the following pieces of information:
- Host: The host of your Postgres server, e.g.
localhost
. - Port: The port where your Postgres server listens, e.g.
5432
. - User & Password: The credentials for your Postgres server.
- Name of existing database: The name of the Postgres database.
- Name of existing schema: The name of the Postgres schema, e.g.
public
.
You also need to know whether your database server uses SSL.
Install the Prisma CLI
The Prisma CLI is used for various Prisma workflows. You can install it using Homebrew or NPM:
brew tap prisma/prisma brew install prisma
Copy
Install Docker
To use Prisma locally, you need to have Docker installed on your machine. If you don't have Docker yet, you can download the Docker Community Edition for your operating system here.
Set up Prisma server
Create new directory
mkdir hello-world cd hello-world
Copy
Create Docker Compose file
To launch Prisma on your machine, you need a Docker Compose file that configures Prisma and specifies to which database it can connect:
touch docker-compose.yml
Copy
Add Prisma Docker image
Paste the following contents into the Docker Compose file you just created:
version: '3' services: prisma: image: prismagraphql/prisma:1.20 restart: always ports: - '4466:4466' environment: PRISMA_CONFIG: | port: 4466 databases: default: connector: postgres host: __YOUR_POSTGRES_HOST__ port: __YOUR_POSTGRES_PORT__ database: __YOUR_POSTGRES_DB__ schema: __YOUR_POSTGRES_SCHEMA__ user: __YOUR_POSTGRES_USER__ password: __YOUR_POSTGRES_PASSWORD__ migrations: false ssl: __SSL_CONNECTION__
Copy
Specify database connection
To specify the database to which Prisma should connect, replace the placeholders that are spelled all-uppercased in the Docker Compose files with the corresponding values of your database:
__YOUR_POSTGRES_HOST__
: The host of your Postgres server, e.g.localhost
. (When connecting to a local database, you might need to usehost.docker.internal
.)__YOUR_POSTGRES_PORT__
: The port where your Postgres server listens, e.g.5432
.__YOUR_POSTGRES_DB__
: The name of your Postgres database.__YOUR_POSTGRES_SCHEMA__
: The name of your Postgres schema, e.g.public
.__YOUR_POSTGRES_USER__
: The database user.__YOUR_POSTGRES_PASSWORD__
: The password for the database user.__SSL_CONNECTION__
: Whether your database server uses SSL, possible values aretrue
andfalse
.
Launch Prisma
To start Prisma and connect it to your database, run the following command:
docker-compose up -d
Copy
Prisma is now connected to your database and runs on http://localhost:4466
.
Derive Prisma datamodel from database schema
Create prisma.yml
Next, you need to create a prisma.yml
:
touch prisma.yml
Copy
Now add the following contents to it:
endpoint: http://localhost:4466
Copy
The
endpoint
needs to match the URL of a running Prisma server.
Introspect database
You now need to introspect your database schema to generate the datamodel which is the foundation for the API of your Prisma client:
prisma introspect
Copy
The CLI generates the datamodel-[TIMESTAMP].prisma
(e.g. datamodel-1533886167692.prisma
) file containing the SDL version of your database schema. On the first run, it also writes the datamodel
property into the prisma.yml
.
Finally, you need to rename the file to datamodel.prisma
because that's the file name you specifed in prisma.yml
.
Deploy the Prisma API
You now have the minimal setup ready to deploy your Prisma API. Run the following command (this does not change anything in your database):
prisma deploy
Copy
Launching the Prisma server may take a few minutes. In case the prisma deploy
command fails, wait a few minutes and try again. Also run docker ps
to ensure the Docker container is actually running.
Generate your Prisma client
The Prisma client is a custom, auto-generated library that connects to your Prisma API. Append the following lines to the end of your prisma.yml
:
generate: - generator: typescript-client output: ./generated/prisma-client/
Copy
Now generate the client with this command:
prisma generate
Copy
The CLI now stored your Prisma client inside the ./generated/prisma-client/
directory as specified in prisma.yml
.
Prepare TypeScript application
Create your tsconfig.json
with the following command:
touch tsconfig.json
Copy
Add the following configuration to the tsconfig.json
file:
{ "compilerOptions": { "lib": ["es2016", "esnext.asynciterable"] } }
Copy
Next, initialize an empty NPM project in the current directory and install the required dependencies:
npm init -y npm install --save prisma-client-lib graphql npm install --save-dev typescript ts-node
Copy
Almost done! Run the following command to create an empty TypeScript script:
touch index.ts
Copy
Great, you're now ready to write some code and talk to your database programmatically!
Read and write data using the Prisma client
The API operations of the Prisma client depend on the datamodel that was generated from the database introspection. The following sample queries assume there is a User
type in the datamodel defined as follows:
type User {
id: ID! @unique
name: String!
}
If you don't have such a User
type, you need to adjust the following code snippets with a type that matches your datamodel.
Add the following code in index.ts
:
import { prisma } from './generated/prisma-client' // A `main` function so that we can use async/await async function main() { // Create a new user called `Alice` const newUser = await prisma.createUser({ name: 'Alice' }) console.log(`Created new user: ${newUser.name} (ID: ${newUser.id})`) // Read all users from the database and print them to the console const allUsers = await prisma.users() console.log(allUsers) } main().catch(e => console.error(e))
Copy
Before executing the code, go ahead and add a start
script to package.json
so you can comfortably run the code:
{ "name": "hello-world", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "start": "ts-node index.ts" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "graphql": "^14.0.2", "prisma-client-lib": "^1.20.0" }, "devDependencies": { "ts-node": "^7.0.1", "typescript": "^3.1.6" } }
Copy
Now execute the script with the following command:
npm run start
Copy
Whenever you run the script with that command, a new user record is created in the database (because of the call to createUser
).
Feel free to play around with the Prisma client API and try out some of the following operations by adding the following code snippets to the file (at the end of the main
function) and re-executing the script:
const user = await prisma.user({ id: '__USER_ID__' })
Copy
In some snippets, you need to replace the
__USER__ID__
placeholder with the ID of an actual user.