prismaql-cli
v0.1.5
Published
CLI tool for managing and editing Prisma schema files using PrismaQL DSL.
Downloads
19
Maintainers
Readme
PrismaQL CLI - Command-Line Interface for Prisma Schema Management
Introduction
PrismaQL CLI is a command-line tool that leverages the PrismaQL Core engine to manage and edit Prisma schemas via a SQL-like DSL. It allows you to execute query and mutation commands directly in your terminal, enabling everything from listing models to creating complex relations.
Key advantages:
- Declarative Command Syntax – Intuitive and human-readable commands like
GET MODELS
,ADD FIELD
, and more. - Query & Mutation Separation – Clear distinction between read-only operations (
GET
,PRINT
,VALIDATE
) and modifying ones (ADD
,DELETE
,UPDATE
). - Configurable Workflow – Easily extend and integrate custom handlers for queries and mutations.
- Safe & Reversible Edits – Built-in validation with automatic backups to ensure data integrity.
- Flexible Relation Management – Supports 1:1, 1:M, and M:N relationships, including pivot table-based relations. Allows both direct and indirect (foreign-key-only) associations, with the ability to choose the FK holder side for precise schema control.
How It Works
- Parsing DSL – Raw text commands (e.g.
GET MODEL User;
) go through the PrismaQlDslParser, producing a structured object. - Chained Commands – You can chain multiple commands in a single line, separated by semicolons, and they will be executed sequentially.
- Validation & Execution – Queries simply inspect the schema; mutations modify it, ensuring AST-level integrity.
- Backup & Save – Each mutation can undergo a dry run, then save changes. Old versions are stored in
.prisma/backups
. - Extensible Handlers – You can register query or mutation handlers to shape how commands are processed.
Example Commands
prismaql "ADD MODEL User ({name String}); ADD MODEL Profile ({age Int})(empty); ADD RELATION User AND Profile (type=1:M, fkHolder=Profile); GET RELATIONS Profile;" --dry
📸 Result
Installation
Install globally using npm:
npm install -g prismaql-cli
This will give you the prismaql
command in your terminal.
Command Pattern
A command typically follows this structure:
ACTION COMMAND ...args ({PRISMA_BLOCK}) (OPTIONS);
- ACTION – One of
GET
,PRINT
,VALIDATE
,ADD
,DELETE
,UPDATE
. - COMMAND – A specific target (e.g.,
MODEL
,RELATION
,ENUM
,GENERATORS
,GENERATOR
). - ARGS – Varies by command (e.g.,
User
,User,Post
,fieldName
). - PRISMA_BLOCK – An optional Prisma snippet in
({ ... })
format, used for model/field definitions. - OPTIONS – Additional parameters in
(key=value, flag, ...)
format.
Basic Usage
prismaql <command> [--dry]
<command>
– A PrismaQL DSL command likeGET MODELS;
,ADD FIELD name TO User ({String});
, etc.--dry
– (Optional) Performs a dry run without applying any changes to the schema.
Examples
# Query all models
prismaql "GET MODELS;"
# Add a new field
prismaql "ADD FIELD email TO User ({String @unique});"
# Remove a model
prismaql "DELETE MODEL TempData;"
Supported Commands
PrismaQL CLI supports the same Query and Mutation commands as the core library:
1. Query Commands
GET MODELS
– List all models with highlighting.GET MODEL <name> (empty?)
– Show details for a specific model (fields, relations, etc.).GET ENUM_RELATIONS <enum>
– Show references to a specific enum across models.GET FIELDS <model>
– List fields for a model.GET FIELDS <field,field2> IN <model>
– Show specific fields.GET RELATIONS <model,model2> (depth?=1)
– Display relations; optionally set a depth.GET ENUMS (raw?)
/GET ENUMS <enum, ...>
– Show one or more enums.GET MODELS_LIST
– Display a sorted list of all models.PRINT
– Print the entire schema in color.GET DB
– Show the current database connection.GET GENERATORS
– List all generators.VALIDATE
– Validate the schema.
2. Mutation Commands
ADD MODEL <name> ({...})
– Create a new model with a Prisma block.ADD FIELD <name> TO <model> ({String})
– Add a field to a model.ADD RELATION <modelA> AND <modelB> (type=1:M, ...)
– Create a relation between two models.ADD ENUM <name> ({A|B|C})
– Create a new enum.DELETE MODEL <name>
– Delete a model.DELETE FIELD <name> IN <model>
– Remove a field.DELETE RELATION <modelA>, <modelB> (relationName=...)
– Remove a relation.DELETE ENUM <name>
– Delete an enum.UPDATE FIELD <name> IN <model> ({...})
– Recreate a field (caution).UPDATE ENUM <name> ({A|B}) (replace=?)
– Append or replace enum values.UPDATE DB (url='...', provider='...')
– Update the database connection.UPDATE GENERATOR <name> ({...}) (provider='...', output='...')
– Update a generator.ADD GENERATOR <name> ({...})
– Add a new generator.DELETE GENERATOR <name>
– Remove a generator.
Each command follows the ACTION COMMAND ARGS (PRISMA_BLOCK) (OPTIONS)
pattern.
Query Commands (READ-ONLY)
GET MODELS
- Description: Lists all models with syntax highlighting.
- Usage:
GET MODELS;
GET MODEL <name>
- Description: Shows a detailed view of a specific model, including required fields and relations.
- Usage:
GET MODEL User;
GET ENUM_RELATIONS <enum>
- Description: Displays all models and fields referencing a specific enum.
- Usage:
GET ENUM_RELATIONS UserRoleEnum;
GET FIELDS <model>
- Description: Lists all fields of a given model.
- Usage:
GET FIELDS User;
GET FIELDS <field, field2> IN <model>
- Description: Retrieves and filters specific fields of a model.
- Usage:
GET FIELDS name, email IN User;
GET RELATIONS <model, model2> (depth?=1)
- Description: Shows relations among specified models. Accepts an optional depth.
- Usage:
GET RELATIONS User, Post (depth=2);
GET DB
- Description: Outputs the provider's current database connection and url.
- Usage:
GET DB;
GET GENERATORS
- Description: Lists all generators in the schema.
- Usage:
GET GENERATORS;
GET ENUMS (raw?)
- Description: Lists all enums in a formatted or raw representation.
- Usage:
GET ENUMS (raw=true);
GET ENUMS <enum, enum>
- Description: Filters and displays specific enums.
- Usage:
GET ENUMS UserRole, AnotherEnum;
GET MODELS_LIST
- Description: Outputs all model names in a sorted list.
- Usage:
GET MODELS_LIST;
PRINT
- Description: Prints the entire schema with color formatting.
- Usage:
PRINT;
VALIDATE
- Description: Validates the current schema, checking for errors.
- Usage:
VALIDATE;
Mutation Commands (WRITE OPERATIONS)
ADD MODEL <name> ({...})
- Description: Creates a new model. Requires two parameters:
name
and a Prisma block with fields. - Example:
ADD MODEL User ({ id Int @id @default(autoincrement()) | name String });
empty
– If specified, the model is created without fields (creadtAt, updatedAt, deletedAt are added by default).
ADD FIELD <name> TO <model> ({String})
- Description: Adds a new field to a model. Requires the field name, the model name, and a Prisma block describing field attributes.
- Example:
ADD FIELD email TO User ({String @unique});
ADD RELATION <modelA> AND <modelB> (...options)
- Description: Creates a relation between two models. Supports multiple options:
type
(required): Defines the relation type:"1:1" | "1:M" | "M:N"
.pivotTable
(optional):string | true
. Iftrue
, a pivot table is created automatically. In1:1
or1:M
, it can create an intermediate table.fkHolder
(optional): Specifies which model holds the foreign key.required
(optional): Marks the relation as required (true
) or optional (false
). Defaults totrue
.relationName
(optional): Custom relation name. If omitted, a name is generated.
- Example:
ADD RELATION User TO Profile ( type=1:1, pivotTable=true, fkHolder=User, required=false, relationName=UserProfile );
ADD ENUM <name> ({A|B|C})
- Description: Creates a new enum. The block can include values separated by
|
. - Example:
ADD ENUM Role ({ADMIN|USER|SUPERUSER});
DELETE MODEL <name>
- Description: Removes a model by name.
- Example:
DELETE MODEL TempData;
DELETE FIELD <name> IN <model>
- Description: Removes a specific field from a model.
- Example:
DELETE FIELD email IN User;
DELETE RELATION <modelA>, <modelB> (...options)
- Description: Unlinks relations between two models. If no options are passed, all relations between them are removed.
fieldA
(optional): Field name on Model A.fieldB
(optional): Field name on Model B.relationName
(optional): If a relation was named via@relation("myRel")
, specify it here.
- Example:
DELETE RELATION User, Post ( fieldA=userId, fieldB=authorId, relationName=UserPosts );
DELETE ENUM <name>
- Description: Removes an existing enum.
- Example:
DELETE ENUM Role;
UPDATE FIELD <name> IN <model> ({...})
- Description: Recreates the specified field in a model, which can break migrations if used carelessly.
- Example:
UPDATE FIELD email IN User ({String @unique @db.VarChar(255)});
UPDATE ENUM <name> ({A|B})(replace?)
- Description: Updates an enum. By default, new values are appended; with
replace=true
, the existing enum is replaced. - Example:
UPDATE ENUM Role ({ADMIN|SUPERADMIN}) (replace=true);
UPDATE DB (url='...', provider='...')
- Description: Updates the database connection URL and provider.
- Example:
UPDATE DB ( url='mysql://user:password@localhost:3306/db', provider='mysql' );
UPDATE GENERATOR <name> ({...})(provider='...', output='...')
- Description: Updates a generator with new options.
- Example:
UPDATE GENERATOR client ({provider='prisma-client-js', output='@prisma/client'});
ADD GENERATOR <name> ({...})
- Description: Adds a new generator to the schema.
- Example:
ADD GENERATOR client ({provider='', output=''});
DELETE GENERATOR <name>
- Description: Removes a generator from the schema.
- Example:
DELETE GENERATOR client;
Dry Run and Confirmation
--dry
– When you append this flag, the command simulates changes but does not modify the schema. This is useful for verifying correctness.- Confirmation Hooks – If you integrate the CLI with a script, you can prompt users for confirmation after seeing the changes (the CLI provides a confirmation mechanism in interactive scenarios).
Backup and Restore
By default, whenever the CLI applies a mutation, it stores the previous schema version under .prisma/backups
. This helps to:
- Rollback if something breaks.
- Track incremental changes over time.
CLI Workflow
- Prepare your Prisma schema – Typically located in
prisma/schema.prisma
. - Issue commands – Use DSL statements like
GET MODELS
,ADD FIELD
, etc. - (Optional) Dry Run – Evaluate changes with
--dry
. - Apply & Backup – The CLI commits changes to the schema, backing up the old version.
- Validate – Run
VALIDATE
to ensure the schema remains consistent.
Common Tips
- Always Validate – Use
VALIDATE
after major changes. - Use Dry Runs – For complex changes, do a dry run first to ensure correctness.
- Look for .prisma/backups – If something goes wrong, you can restore from backups.
- Combine Commands – You can pass multiple statements separated by semicolons.
Project Status
- Contributions Welcome – Please report issues and PRs on GitHub.
License
PrismaQL CLI is licensed under the MIT License.
© 2025 Artyom Gorlovetskiy.