Generator modelu Prisma
Wpisz pola, a dostaniesz gotowy model do schema.prisma z sekcją datasource i listą błędów do poprawienia.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Opcje
schema.prisma
Pola
Opcjonalne
Pola z znakiem ?
Typy własne
Relacje i enumy
Uwagi
| Pole | Typ | Wymagalność | Atrybuty |
|---|---|---|---|
| id | Int | wymagane | @id @default(autoincrement()) |
| String | wymagane | @unique | |
| name | String? | opcjonalne | — |
| createdAt | DateTime | wymagane | @default(now()) |
| updatedAt | DateTime | wymagane | @updatedAt |
Ściąga: typy skalarne Prisma
| Typ | Co przechowuje | Przykład |
|---|---|---|
| String | Tekst | name String |
| Boolean | Prawda / fałsz | published Boolean @default(false) |
| Int | Liczba całkowita | stock Int @default(0) |
| BigInt | Duża liczba całkowita (64-bitowa) | views BigInt |
| Float | Liczba zmiennoprzecinkowa | rating Float |
| Decimal | Dokładna liczba dziesiętna (np. ceny) | price Decimal |
| DateTime | Data i czas | createdAt DateTime @default(now()) |
| Json | Dane w formacie JSON | settings Json |
| Bytes | Dane binarne | avatar Bytes |
Ściąga: najczęstsze atrybuty
| Atrybut | Znaczenie | Przykład |
|---|---|---|
| @id | Klucz główny | id Int @id |
| @default(...) | Wartość domyślna, np. autoincrement(), uuid(), now() | id String @id @default(uuid()) |
| @unique | Wartość nie może się powtórzyć | email String @unique |
| @updatedAt | Czas ostatniej zmiany ustawiany automatycznie (DateTime) | updatedAt DateTime @updatedAt |
| @map("nazwa") | Inna nazwa kolumny w bazie | createdAt DateTime @map("created_at") |
| @relation(...) | Powiązanie z innym modelem | author User @relation(fields: [authorId], references: [id]) |
| @@index([pole]) | Indeks przyspieszający wyszukiwanie | @@index([email]) |
| @@unique([a, b]) | Unikalna kombinacja pól | @@unique([userId, postId]) |
| @@id([a, b]) | Klucz główny złożony z kilku pól | @@id([userId, postId]) |
| @@map("tabela") | Inna nazwa tabeli w bazie | @@map("users") |
Jak zapisać pole
Jedno pole w linii: nazwa Typ atrybuty. Dwukropek po nazwie też działa (email: String). Znak ? po typie oznacza pole opcjonalne (String?), a [] listę (String[]). Atrybuty zaczynają się od @, np. @unique. Linie zaczynające się od // trafiają do modelu jako komentarze.
Atrybuty całego modelu
Linie zaczynające się od @@ (np. @@index([email]) albo @@unique([a, b])) trafiają na koniec modelu. Pole „Nazwa tabeli w bazie” samo dodaje @@map("nazwa"), jeśli nie wpisano go ręcznie.
Po wygenerowaniu
Wklej wynik do pliku prisma/schema.prisma. Polecenie npx prisma validate sprawdzi składnię, npx prisma format uporządkuje plik, a npx prisma migrate dev utworzy migrację. Zmienna DATABASE_URL musi być ustawiona w pliku .env.
MongoDB
W MongoDB identyfikator zwykle zapisuje się jako: id String @id @default(auto()) @map("_id") @db.ObjectId. Zapis autoincrement() jest tam niedostępny.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćCo robi generator modelu Prisma
Prisma to ORM dla Node.js i TypeScript. Model w pliku schema.prisma opisuje tabelę (w MongoDB kolekcję) i jej kolumny, a Prisma generuje z niego typowany klient i migracje. Generator modelu Prisma zamienia listę pól wpisaną w formacie nazwa Typ atrybuty na gotowy blok model, opcjonalnie poprzedzony sekcjami generator i datasource, i wypisuje uwagi o typowych błędach, np. braku identyfikatora.
Budowa modelu
| Zapis | Znaczenie |
|---|---|
@id | klucz główny |
@default(...) | wartość domyślna, np. autoincrement(), uuid(), now() |
@unique | wartość unikalna |
@updatedAt | automatyczna data modyfikacji (tylko typ DateTime) |
@map("nazwa") | inna nazwa kolumny w bazie |
? po typie | pole opcjonalne (nullable) |
[] po typie | lista wartości albo druga strona relacji |
Przykład
Dane startowe narzędzia (przycisk „Przywróć przykład”) dają taki model User:
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Sekcja generator i datasource
Przy zaznaczonej opcji „Dodaj generator i datasource” (domyślnie włączona) wynik zaczyna się od dwóch bloków:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
Wartość provider wybierasz z listy: postgresql, mysql, sqlite, sqlserver, mongodb lub cockroachdb. Adres bazy jest zawsze odczytywany ze zmiennej DATABASE_URL, którą ustawiasz w pliku .env. Jeśli dopisujesz model do istniejącego schematu, odznacz tę opcję: plik może mieć tylko jeden blok datasource.
Migracje
npx prisma validate sprawdza składnię schematu, npx prisma format porządkuje wcięcia. npx prisma migrate dev --name init tworzy i stosuje migrację na podstawie schematu, a npx prisma generate odświeża typowanego klienta.
Jak działa generator modelu Prisma
Narzędzie nie łączy się z bazą danych, nie czyta projektu Node.js i nie zna Twojego istniejącego pliku schema.prisma. Pracuje wyłącznie na tym, co wpiszesz: nazwie modelu, liście pól (jedno w linii), wybranym dostawcy bazy i opcjonalnej nazwie tabeli. Z tych danych składa tekst w składni Prisma: nagłówek modelu, po jednej linii na każde pole w kolejności wpisania, atrybuty całego modelu i nawias zamykający.
Każda linia ma postać nazwa Typ atrybuty. Dwukropek po nazwie (email: String) też jest akceptowany i znika z wyniku. Znak ? po typie oznacza pole opcjonalne, [] listę, a atrybuty muszą zaczynać się od @. Linie zaczynające się od // trafiają do modelu jako komentarze, a linie od @@ (np. @@index([email])) lądują na końcu bloku. Typy wpisane małymi literami narzędzie poprawia (string → String, bool → Boolean, integer → Int), bo Prisma rozróżnia wielkość liter. Typ spoza listy typów skalarnych, np. Post albo Role, jest traktowany jako model lub enum, który musi istnieć w schemacie.
Linie, których nie da się rozpoznać (brak typu, nazwa zaczynająca się cyfrą, atrybut bez @, powtórzona nazwa pola), są pomijane, a pod wynikiem pojawia się uwaga z numerem linii. Lista pól może mieć do 100 linii i 6000 znaków. Nazwa modelu ma najwyżej 60 znaków, zaczyna się od litery i zawiera tylko litery, cyfry oraz znak _.
Generator nie zmienia wielkości liter w nazwach, tylko podpowiada, że modele pisze się zwyczajowo w PascalCase (User, nie user). Kolejność bloków w pliku schema.prisma nie ma znaczenia, ale nazwy modeli muszą być unikalne w całym schemacie.
Co sprawdza narzędzie
- czy model ma identyfikator: pole z
@idlub@uniquealbo wpis@@id/@@unique, - czy pole z
@idnie jest opcjonalne, - czy
@updatedAtstoi przy polu typu DateTime, - czy przy MongoDB nie użyto
autoincrement()(podpowiada zapis z@default(auto()) @map("_id") @db.ObjectId), - czy listy typów prostych, np.
String[], nie trafiły do MySQL, SQLite lub SQL Server; obsługują je PostgreSQL, CockroachDB i MongoDB.
Przykład krok po kroku: model Post
- W polu „Nazwa modelu” wpisujesz Post. Prisma nie tworzy liczby mnogiej: bez
@@maptabela też będzie się nazywać Post. - W polu „Pola” wpisujesz sześć linii:
id Int @id @default(autoincrement()),title String,slug String @unique,body String?,published Boolean @default(false)icreatedAt DateTime @default(now()). - Pole slug służy do adresów URL i dzięki
@uniquenie może się powtarzać między rekordami. Znak zapytania przy body oznacza kolumnę, która dopuszcza wartość pustą. - Pole published ma wartość domyślną false, więc nowy rekord startuje jako nieopublikowany, a createdAt wypełnia się czasem utworzenia rekordu.
- W opcjach wpisujesz nazwę tabeli posts. Narzędzie samo dopisze na końcu modelu
@@map("posts").
Po kliknięciu „Generuj model” dostajesz (pomijając sekcje generator i datasource):
model Post {
id Int @id @default(autoincrement())
title String
slug String @unique
body String?
published Boolean @default(false)
createdAt DateTime @default(now())
@@map("posts")
}
Blok ma 10 linii: nagłówek, sześć pól, pustą linię, @@map i nawias zamykający. Kafelki pokażą 6 pól, 1 opcjonalne, 0 typów własnych i 0 uwag. Gdyby zabrakło linii z id, narzędzie nie zgłosi braku identyfikatora, bo slug ma @unique, co Prisma też akceptuje; klucz główny i tak warto mieć.
Elementy schematu, które warto znać
| Element | Zapis w schema.prisma | Do czego służy |
|---|---|---|
| Tekst | String | Pola tekstowe o zmiennej długości, nazwy, opisy, adresy |
| Liczba całkowita | Int lub BigInt | Liczniki, identyfikatory, wartości przekraczające zakres Int |
| Liczba zmiennoprzecinkowa | Float lub Decimal | Pomiary oraz kwoty pieniężne, gdzie Decimal daje dokładny wynik bez błędów zaokrągleń |
| Data i czas | DateTime | Znaczniki utworzenia, publikacji i modyfikacji rekordu |
| Wartość logiczna | Boolean | Flagi włączone i wyłączone, np. widoczność wpisu |
| Dane bez sztywnej struktury | Json | Metadane, konfiguracja lub odpowiedź z zewnętrznego API |
| Dane binarne | Bytes | Małe pliki, skróty, klucze w postaci bajtów |
| Lista wartości | Typ z [] na końcu | Wiele wartości w jednym polu, np. tagi; typy proste tylko w PostgreSQL, CockroachDB i MongoDB |
| Indeks i unikalność modelu | @@index oraz @@unique | Przyspieszenie filtrowania i klucze złożone z kilku kolumn |
| Mapowanie nazw | @@map oraz @map | Zgodność z konwencją snake_case w istniejącej bazie |
Praktyczne wskazówki
- Nazywaj modele rzeczownikiem w liczbie pojedynczej: Post, a nie Posts. Prisma nie zmienia liczby przy mapowaniu na tabelę, więc jeśli tabela ma się nazywać posts, wpisz to w polu „Nazwa tabeli w bazie”.
- Ustal konwencję nazw przed pierwszym modelem. Jeśli baza używa snake_case, dodaj
@map("created_at")przy polach od razu, zamiast poprawiać kilkadziesiąt pól później. - Dodawaj indeksy razem z polami, po których filtrujesz. Pole, które w zapytaniach trafia do warunku WHERE lub do sortowania, powinno mieć wpis
@@index([pole])na poziomie modelu. - Przemyśl opcjonalność od początku. Dodanie wymaganego pola do tabeli, która już ma dane, zwykle wymaga wartości domyślnej albo ręcznej migracji z uzupełnieniem istniejących rekordów.
- Trzymaj plik schema.prisma w repozytorium i przeglądaj jego zmiany jak zwykły kod źródłowy.
Czego narzędzie nie uwzględnia
- Sprawdza format nazw i powtórzenia pól w obrębie modelu, ale nie wie, czy nazwa modelu nie koliduje ze słowem zarezerwowanym Prisma albo z modelem w Twoim schemacie. Wychwyci to dopiero
prisma validate. - Pole relacji z
@relationmożesz wpisać sam (gotowy przykład daje przycisk „Comment (relacja)”), ale drugą stronę relacji w modelu docelowym musisz dopisać ręcznie. - Nie tworzy bloków
enumani kilku modeli naraz. Każdy typ własny użyty w polach musi już istnieć w schemacie. - Nie porównuje wyniku z rzeczywistą strukturą tabel, nie importuje schematu i nie wykryje rozjazdu między modelem a stanem bazy. Do tego służy
npx prisma db pull. - Nie generuje migracji, seedów ani klienta. Polecenia migracyjne i generujące uruchamiasz w projekcie po zapisaniu pliku.
- Sekcje nagłówkowe mają klasyczną postać (
prisma-client-js,url = env("DATABASE_URL")). W nowszych wersjach Prisma część konfiguracji przeniesiono do plikuprisma.config.ts, dlatego sprawdź je z dokumentacją wersji, której używasz.
Najczęstsze pytania
Jak dodać relację w modelu Prisma?
Dodaj pole klucza obcego i pole relacji, np. postId Int oraz post Post @relation(fields: [postId], references: [id]). W modelu Post dopisz drugą stronę: comments Comment[].
Którego dostawcę bazy wybrać?
PostgreSQL sprawdza się w większości aplikacji, SQLite w prototypach i testach, MongoDB przy danych dokumentowych. W MongoDB identyfikator zapisuje się jako id String @id @default(auto()) @map("_id") @db.ObjectId.
Czy mogę wygenerować kilka modeli naraz?
Nie, jedno uruchomienie daje jeden model. Generuj modele po kolei, a przy drugim i kolejnym odznacz „Dodaj generator i datasource”, żeby nie powielić tych sekcji w pliku.
Jak wkleić wynik do istniejącego schematu?
Skopiuj blok modelu przyciskiem „Kopiuj schemat” i wstaw go na końcu pliku schema.prisma. Potem uruchom npx prisma validate i dopiero wtedy generuj klienta lub migrację.
Czy generator obsługuje enumy i listy?
Listy tak: wpisz [] po typie, np. tags String[]. Enum musisz zadeklarować osobno jako blok enum Role { USER ADMIN }, a w modelu użyć go jak typu, np. role Role @default(USER).
Jak zrobić klucz główny złożony z dwóch kolumn?
Wpisz w liście pól osobną linię @@id([userId, postId]). Narzędzie umieści ją na końcu modelu i uzna za identyfikator.