Przejdź do głównej zawartości

Przepisy bazodanowe

Przepisy bazodanowe to cztery strony gotowych promptów dla Claude Code, Codeksa i Cursora: migracje schematu, kod ORM, optymalizacja SQL i modele danych NoSQL. Każdy przepis zakłada dwie rzeczy: agent czyta prawdziwy schemat przez połączenie tylko do odczytu, a bezpieczeństwo każdej zmiany udowadnia prawdziwy silnik bazy danych, a nie człowiek czytający SQL.

Ta strona jest dla programistów, którzy oddają agentowi bazodanową część nowej funkcji. Znasz ten scenariusz: migracja przechodzi na pustej lokalnej bazie, a na produkcji blokuje tabelę z 40 milionami wierszy. Albo agent wymyśla kolumnę, bo zgadł schemat z pliku modelu.

Wybieraj według zadania, które masz przed sobą, a nie według kolejności na liście.

Twoje zadaniePrzepisBramka, która to udowadnia
Zmiana nazwy, podział lub uzupełnienie kolumny bez przestojuWzorce migracji baz danychLint Squawkiem, zapytanie o zgodność danych zwracające zero wierszy, wycofanie dla każdej fazy
Modele Prisma lub TypeORM, zapytania N+1, transakcjeNajlepsze praktyki ORMTesty integracyjne na prawdziwym Postgresie; liczba zapytań na żądanie
Wolne zapytanie albo brakujący indeksWzorce optymalizacji SQLPostgres EXPLAIN (ANALYZE, BUFFERS) / MySQL EXPLAIN ANALYZE przed zmianą i po niej, na realistycznych danych
Modele danych w MongoDB, DynamoDB, Neo4j lub bazie wektorowejWzorce i strategie NoSQLTesty wzorców dostępu na prawdziwym silniku

Pełny przepływ pracy wokół tych przepisów (specyfikacja, przegląd schematu, wdrożenie) opisuje strona praca z bazą danych z agentami AI.

Przepis uruchomiony na zgadniętym schemacie daje SQL, który wygląda przekonująco, a jest błędny. Najpierw daj agentowi dostęp tylko do odczytu do bazy lokalnej lub stagingowej. DBHub (Bytebase, npm @bytebase/dbhub 1.3.1 na 2026-09-26) obsługuje jednym serwerem Postgresa, MySQL, SQL Server, MariaDB, Oracle i SQLite. Podłącz go przez rolę, która może tylko czytać. O trybie tylko do odczytu decyduje dopiero brak uprawnień do zapisu; default_transaction_read_only wyłapuje jedynie pomyłki, bo sesja może go wyłączyć. Linia z domyślnymi uprawnieniami sprawia, że agent widzi też tabele utworzone przez kolejne migracje:

-- Uruchom raz w psql na bazie lokalnej lub stagingowej, jako rola, która wykonuje migracje.
-- \password pyta o hasło, więc nie trafia ono do historii powłoki.
CREATE ROLE agent_ro LOGIN;
\password agent_ro
GRANT CONNECT ON DATABASE app TO agent_ro;
GRANT USAGE ON SCHEMA public TO agent_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO agent_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO agent_ro;
ALTER ROLE agent_ro SET default_transaction_read_only = on;

DBHub 1.3.1 odczytuje ciąg połączenia ze zmiennej środowiskowej DSN, więc hasło nie trafia ani do historii powłoki, ani do commitowanego pliku. Wyeksportuj AGENT_RO_DSN w powłoce z menedżera sekretów albo z nieśledzonego pliku .env (wartość ma postać postgres://agent_ro:<hasło>@localhost:5432/app). Rejestracja w trzech narzędziach różni się tylko składnią:

Okno terminala
claude mcp add dbhub -e DSN="$AGENT_RO_DSN" -- npx @bytebase/dbhub@1.3.1 --transport stdio

Polecenia Claude Code i Codeksa zapisują rozwinięty DSN otwartym tekstem w ~/.claude.json (domyślnie w zakresie local) albo w ~/.codex/config.toml, poza repozytorium; traktuj te pliki jak sekrety. Dokumentacja MCP Cursora opisuje interpolację ${env:NAZWA} w mcp.json; zanim zacommitujesz plik, sprawdź, czy działa w twojej wersji Cursora (np. czy serwer się łączy).

DBHub ma też własne zabezpieczenia, w tym tryb tylko do odczytu i limit wierszy (zobacz jego README). Traktuj je jako drugą warstwę; o bezpieczeństwie decyduje brak uprawnień do zapisu w roli.

Serwery dla konkretnych silników (Supabase, Neon, Postgres MCP Pro, MongoDB) porównuje strona serwery MCP dla baz danych.

Jak zweryfikować zmiany w bazie bez czytania każdej linii?

Dział zatytułowany „Jak zweryfikować zmiany w bazie bez czytania każdej linii?”

Niech recenzentem będzie baza danych. Zmiana jest gotowa, gdy przechodzi bramkę z tabeli powyżej, a agent dołącza jej wynik — nie wtedy, gdy SQL wygląda poprawnie.

  • Migracje: sprawdź każdy nowy plik migracji Squawkiem, potem zastosuj, wycofaj i zastosuj ponownie na jednorazowej kopii o wolumenie zbliżonym do produkcji, a zapytanie o zgodność danych uruchamiaj, aż zwróci zero. Ustaw lock_timeout, żeby polecenie czekające na blokadę szybko kończyło się błędem, zamiast ustawiać za sobą w kolejce wszystkie zapisy.
  • Uzupełnianie danych: porównaj liczby wierszy i sumę kontrolną zmienianych kolumn przed operacją i po niej.
  • Zapytania: dołącz wynik EXPLAIN (ANALYZE, BUFFERS) w Postgresie lub EXPLAIN ANALYZE w MySQL przed zmianą i po niej, uruchomiony na realistycznych danych. EXPLAIN ANALYZE wykonuje polecenie, więc przy zapisach opakuj je w BEGIN … ROLLBACK na jednorazowej kopii.
  • Kod ORM: testy integracyjne na prawdziwym silniku, na przykład w Postgresie z Testcontainers; zobacz testy integracyjne i zarządzanie danymi testowymi.

Człowiek zatwierdza jedną rzecz: każdy krok destrukcyjny (DROP, faza contract we wzorcu expand-contract). To zatwierdzenie trafia do pakietu dowodów w pull requeście.

  • Wymyślone kolumny lub złe typy. Agent przeczytał model ORM, a nie bazę. Naprawa: uruchom prompt, który każe agentowi najpierw odczytać schemat, i dopisz do CLAUDE.md lub AGENTS.md regułę „cytuj aktualny schemat”.
  • Migracja zielona lokalnie, a na produkcji blokuje tabelę. Lokalna tabela miała 50 wierszy. Naprawa: powtórz bramkę na kopii o rozmiarze produkcji z ustawionym lock_timeout i podziel zmianę według przepisu wzorce migracji.
  • Zmiana nazwy w ORM wygenerowana jako usunięcie i dodanie kolumny. Diff modelu ukrywa utratę danych. Naprawa: przeglądaj wygenerowany SQL, a nie plik modelu, i wymagaj sprawdzenia liczby wierszy przy każdej migracji.
  • Indeks, który przyspiesza jedno zapytanie i spowalnia zapisy. Naprawa: przepis optymalizacja SQL każe agentowi oszacować koszt zapisu każdego nowego indeksu i odrzucić duplikaty istniejących.
  • Agent zapisał coś do współdzielonej bazy. Naprawa: łącz go wyłącznie przez rolę tylko do odczytu opisaną wyżej, a ograniczenia po stronie agenta opisuje strona uprawnienia i sandboxing.