Ez a projekt egy SQL-alapú kódgenerátor. Egy MySQL/MariaDB adatbázisscriptből előállít egy működő, generikus CRUD alkalmazást:
schema.json sémaleírást,INSERT INTO kezdeti adatokat,/api/meta végpontból kapott metaadatok alapján rajzolja ki a táblákat, űrlapokat és statisztikákat.A projekt célja: bemutatni, hogy egy relációs adatbázis sémájából automatikusan előállítható egy működő CRUD + statisztika alkalmazás.
Javasolt projektstruktúra:
C:\projektek\szakdoga
├── db
│ ├── diaknyilvantartas.sql
│ ├── 01_ugyfel_crud.sql
│ ├── teszt-webshop.sql
│ └── teszt_halado.sql
│
├── generator
│ ├── src
│ │ ├── generate.js
│ │ ├── generate-backend.js
│ │ ├── parseSql.js
│ │ └── test-mysql2.js
│ │
│ ├── out
│ │ ├── schema.json
│ │ └── seed.sql
│ │
│ ├── backend
│ │ ├── app.js
│ │ ├── db
│ │ ├── models
│ │ └── routes
│ │
│ ├── .env
│ └── package.json
│
└── frontend
├── index.html
├── src
│ ├── main.js
│ ├── stats.js
│ └── style.css
└── package.json
Másik adatbázis generálásánál mindig három dolognak kell összhangban lennie:
generator/.env fájlban DB_NAME értékként.Példa:
| SQL fájl | MariaDB adatbázis | .env DB_NAME |
|---|---|---|
db/diaknyilvantartas.sql |
diaknyilvantartas |
DB_NAME=diaknyilvantartas |
db/01_ugyfel_crud.sql |
teszt_ugyfel_crud3 |
DB_NAME=teszt_ugyfel_crud3 |
db/teszt-webshop.sql |
teszt_webshop |
DB_NAME=teszt_webshop |
db/teszt_halado.sql |
teszt_kurzus_halado |
DB_NAME=teszt_kurzus_halado |
Ha ezek nem egyeznek, akkor tipikus hiba lehet:
Unknown databaseTable ... doesn't existUnknown column ... in field listIndítsd el a XAMPP Control Panelt, majd indítsd el:
Apache
MySQL
PowerShell ellenőrzés:
Test-NetConnection 127.0.0.1 -Port 3306
Jó eredmény:
TcpTestSucceeded : True
Ha egy SQL fájlt adott adatbázisnéven szeretnénk használni, akkor:
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS ADATBAZIS_NEV; CREATE DATABASE ADATBAZIS_NEV CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D ADATBAZIS_NEV < "C:\projektek\szakdoga\db\FAJLNEV.sql""
Ez akkor is működik, ha az SQL fájlban nincs külön USE adatbazis; utasítás.
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS diaknyilvantartas; CREATE DATABASE diaknyilvantartas CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D diaknyilvantartas < "C:\projektek\szakdoga\db\diaknyilvantartas.sql""
Ellenőrzés:
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D diaknyilvantartas -e "SHOW TABLES;"
Várt fontos táblák:
hallgato
tanar
tantargy
kurzus
beiratkozas
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS teszt_webshop; CREATE DATABASE teszt_webshop CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D teszt_webshop < "C:\projektek\szakdoga\db\teszt-webshop.sql""
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS teszt_ugyfel_crud3; CREATE DATABASE teszt_ugyfel_crud3 CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D teszt_ugyfel_crud3 < "C:\projektek\szakdoga\db\01_ugyfel_crud.sql""
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS teszt_kurzus_halado; CREATE DATABASE teszt_kurzus_halado CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D teszt_kurzus_halado < "C:\projektek\szakdoga\db\teszt_halado.sql""
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "SHOW DATABASES;"
A projekt szempontjából ezeknek kell látszaniuk:
diaknyilvantartas
teszt_kurzus_halado
teszt_ugyfel_crud3
teszt_webshop
.env beállításaA backend a generator/.env fájlból olvassa ki az adatbázis-kapcsolatot.
Példa:
PORT=3000
DB_HOST=127.0.0.1
DB_USER=root
DB_PASS=
DB_NAME=diaknyilvantartas
DB_PORT=3306
Másik adatbázis generálásakor a DB_NAME értékét át kell írni.
Példa webshophoz:
DB_NAME=teszt_webshop
Fontos: ha a backend már futott, a .env módosítása után a Node backendet újra kell indítani.
cd C:\projektek\szakdoga\generator
npm install
Adatbázis-kapcsolat tesztelése:
npm run db:ping
Megjegyzés: a db:ping teszt eredetileg tartalmazhatott konkrét próbakérdezést, például ügyfél táblára. Ha másik adatbázist használsz, és csak ez a próbakérdezés hibázik, de a SHOW TABLES jó, akkor maga a DB-kapcsolat működik.
A generálás két fő lépésből áll:
out/schema.jsonschema.json → generált backendschema.jsonPélda diáknyilvántartáshoz:
cd C:\projektek\szakdoga\generator
npm run parse:dump -- ..\db\diaknyilvantartas.sql .\out
Kimenet:
generator/out/schema.json
generator/out/seed.sql
A schema.json tartalmazza:
primaryKey információt,autoIncrement információt,ENUM értékeket,phpMyAdmin dumpoknál az AUTO_INCREMENT gyakran nem a CREATE TABLE oszlopsorban van, hanem későbbi ALTER TABLE ... MODIFY ... AUTO_INCREMENT utasításban. A generate.js ezt is kezeli.
Ellenőrzés diáknyilvántartásnál:
node -e "const s=require('./out/schema.json'); console.log(s.tables.find(t=>(t.table||t.name)==='hallgato').columns.find(c=>c.name==='id'))"
Jó eredmény:
autoIncrement: true
schema.json → generált backendnpm run gen:backend
Ez létrehozza/frissíti:
generator/backend/app.js
generator/backend/db/index.js
generator/backend/models/*.js
generator/backend/routes/*.js
generator/backend/routes/meta.js
generator/backend/routes/stats.js
npm run start:backend
Jó indulás:
Megy, API listening on port 3000
Backend ellenőrzés:
Invoke-RestMethod http://localhost:3000/health
Vagy böngészőben:
http://localhost:3000/health
Új PowerShell ablakban:
cd C:\projektek\szakdoga\frontend
npm install
npm run dev
A Vite általában ezt adja:
http://localhost:5173
A frontend API hívásai a backend felé mennek:
http://localhost:3000/api
Példa: diaknyilvantartas.
XAMPP-ben MySQL legyen elindítva.
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS diaknyilvantartas; CREATE DATABASE diaknyilvantartas CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D diaknyilvantartas < "C:\projektek\szakdoga\db\diaknyilvantartas.sql""
.env beállításgenerator/.env:
DB_NAME=diaknyilvantartas
cd C:\projektek\szakdoga\generator
npm run parse:dump -- ..\db\diaknyilvantartas.sql .\out
npm run gen:backend
npm run start:backend
Másik PowerShell ablakban:
cd C:\projektek\szakdoga\frontend
npm run dev
Böngésző:
http://localhost:5173
Ez a legfontosabb rész, ha ugyanazzal a rendszerrel másik SQL adatbázist akarunk kipróbálni.
Másik adatbázisra váltáskor mindig ezt kell csinálni:
generator/.env fájlban a DB_NAME értéket,& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS teszt_webshop; CREATE DATABASE teszt_webshop CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D teszt_webshop < "C:\projektek\szakdoga\db\teszt-webshop.sql""
.envDB_NAME=teszt_webshop
cd C:\projektek\szakdoga\generator
npm run parse:dump -- ..\db\teszt-webshop.sql .\out
npm run gen:backend
Ha fut régi Node backend:
taskkill /F /IM node.exe
Utána:
npm run start:backend
A frontend általában maradhat futva:
cd C:\projektek\szakdoga\frontend
npm run dev
Böngészőben frissítsd az oldalt:
http://localhost:5173
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS teszt_ugyfel_crud3; CREATE DATABASE teszt_ugyfel_crud3 CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D teszt_ugyfel_crud3 < "C:\projektek\szakdoga\db\01_ugyfel_crud.sql""
generator/.env:
DB_NAME=teszt_ugyfel_crud3
Generálás:
cd C:\projektek\szakdoga\generator
npm run parse:dump -- ..\db\01_ugyfel_crud.sql .\out
npm run gen:backend
npm run start:backend
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "DROP DATABASE IF EXISTS teszt_kurzus_halado; CREATE DATABASE teszt_kurzus_halado CHARACTER SET utf8mb4 COLLATE utf8mb4_hungarian_ci;"
cmd /c ""C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -D teszt_kurzus_halado < "C:\projektek\szakdoga\db\teszt_halado.sql""
generator/.env:
DB_NAME=teszt_kurzus_halado
Generálás:
cd C:\projektek\szakdoga\generator
npm run parse:dump -- ..\db\teszt_halado.sql .\out
npm run gen:backend
npm run start:backend
schema.json alapján generálódikHa átírod a .env fájlt, de nem futtatod újra ezt:
npm run parse:dump -- ..\db\megfelelo.sql .\out
npm run gen:backend
akkor a backend még a régi táblákra fog route-okat és modelleket tartalmazni.
Ez okozhat ilyen hibákat:
Table ... doesn't exist
Unknown column ... in field list
A generált backend minden táblához automatikusan létrehoz CRUD végpontokat.
Példa hallgato táblára:
| Művelet | Végpont |
|---|---|
| Lista | GET /api/hallgato |
| Egy rekord | GET /api/hallgato/:id |
| Új rekord | POST /api/hallgato |
| Módosítás | PUT /api/hallgato/:id |
| Törlés | DELETE /api/hallgato/:id |
Kompozit kulcsos táblánál a route több paramétert használ.
Példa:
/api/beiratkozas/:hallgato_id/:kurzus_id
GET /api/meta
Ez adja vissza a frontendnek a táblák és mezők leírását.
GET /api/stats/aggregate?table=...&groupBy=...&agg=...&field=...&excludeNull=1
Támogatott aggregációk:
count
sum
avg
min
max
Példa:
http://localhost:3000/api/stats/aggregate?table=hallgato&groupBy=szak&agg=count&excludeNull=1
A frontend generikus, tehát nem egy konkrét adatbázisra van fixen ráírva.
A /api/meta alapján:
A statisztika oldal szintén metaadat-alapú.
Fő működés:
/api/meta végpontból jön,count, sum, avg, min, max,FK csoportosítás esetén a frontend megpróbál emberibb címkét megjeleníteni.
Példa:
hallgato_id = 4
helyett:
Varga Réka (#4)
Az ID megjelenítése a statisztika oldalon külön kapcsolható.
EADDRINUSE: address already in use :::3000A 3000-es porton már fut egy Node backend.
Megoldás:
taskkill /F /IM node.exe
npm run start:backend
ECONNREFUSED 127.0.0.1:3306A MySQL/MariaDB nem fut.
Megoldás:
Test-NetConnection 127.0.0.1 -Port 3306
Unknown databaseA .env fájlban olyan DB_NAME van, ami nincs létrehozva MariaDB-ben.
Ellenőrzés:
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "SHOW DATABASES;"
Table ... doesn't existA backend olyan táblát keres, ami nincs az aktuális adatbázisban.
Leggyakoribb okok:
.env DB_NAME,schema.json,npm run gen:backend,Megoldás:
taskkill /F /IM node.exe
npm run parse:dump -- ..\db\megfelelo.sql .\out
npm run gen:backend
npm run start:backend
Unknown column ... in field listA generált Sequelize model más oszlopokat tartalmaz, mint az aktuális adatbázis.
Megoldás: ugyanaz, mint az előzőnél. A SQL fájl, a schema.json, a generált backend és a .env ugyanarra az adatbázisra mutasson.
hallgato.id cannot be nullAz AUTO_INCREMENT mező nem került át rendesen a schema.json → Sequelize model láncba.
Ellenőrzés:
node -e "const s=require('./out/schema.json'); console.log(s.tables.find(t=>(t.table||t.name)==='hallgato').columns.find(c=>c.name==='id'))"
Jó esetben:
autoIncrement: true
Utána ellenőrizhető a generált model is:
Get-Content .\backend\models\hallgato.js | Select-String -Pattern '"id":' -Context 0,10
Jó esetben az id alatt szerepel:
autoIncrement: true,
Table ... doesn't exist in engineEz XAMPP/MariaDB adatfájl-sérülésre utalhat.
Biztonságos reset menete:
cd C:\xampp\mysql
Rename-Item .\data .\data_broken
Copy-Item .\backup .\data -Recurse
A backend és a frontend nem egyetlen konkrét adatbázisra van kézzel ráírva.
A folyamat:
SQL fájl
↓
schema.json
↓
generált Sequelize modellek + Express route-ok
↓
/api/meta
↓
generikus frontend
Ezért másik adatbázis használatához jellemzően elég:
.env DB_NAME-et átírni,parse:dump futtatása az új SQL-re,gen:backend futtatása,A frontendnek normál esetben nem kell táblaspecifikus módosítás, mert a táblalistát, mezőket, típusokat és kapcsolatok nagy részét a /api/meta alapján kapja meg.
cd C:\projektek\szakdoga\generator
npm install
npm run parse:dump -- ..\db\diaknyilvantartas.sql .\out
npm run gen:backend
npm run start:backend
cd C:\projektek\szakdoga\frontend
npm install
npm run dev
Test-NetConnection 127.0.0.1 -Port 3306
& "C:\xampp\mysql\bin\mysql.exe" -h 127.0.0.1 -P 3306 -u root -e "SHOW DATABASES;"
Egy bemutatón a következő lépések érdemesek:
diaknyilvantartas adatbázis importálva.generator/.env:DB_NAME=diaknyilvantartas
npm run parse:dump -- ..\db\diaknyilvantartas.sql .\out
npm run gen:backend
npm run start:backend
cd C:\projektek\szakdoga\frontend
npm run dev
Másik adatbázis bemutatása esetén:
.env DB_NAME átírás,parse:dump az új SQL fájlra,gen:backend,