[{"data":1,"prerenderedAt":1434},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-framework-migrations":449,"-hu-framework-migrations-surround":1429},[4,45,120,158,174,204,234,260,272,288,308,327,340,357,374,387,399,426],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F01.getting-started",[10,15,20,25,30,35,40],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F01.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F01.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F01.getting-started\u002F3.first-module","i-lucide-package-plus",{"title":26,"path":27,"stem":28,"icon":29},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F01.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F01.getting-started\u002F5.sample-app","i-lucide-shopping-cart",{"title":36,"path":37,"stem":38,"icon":39},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F01.getting-started\u002F6.coming-from-laravel","i-lucide-arrow-right-left",{"title":41,"path":42,"stem":43,"icon":39},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F01.getting-started\u002F7.coming-from-symfony",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F02.cli",[51,55,60,65,70,75,80,85,90,95,100,105,110,115],{"title":52,"path":53,"stem":54,"icon":47},"Áttekintés","\u002Fhu\u002Fcli\u002Foverview","hu\u002F02.cli\u002F1.overview",{"title":56,"path":57,"stem":58,"icon":59},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F02.cli\u002F10.add-compose","i-lucide-container",{"title":61,"path":62,"stem":63,"icon":64},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F02.cli\u002F11.add-mail","i-lucide-mail-plus",{"title":66,"path":67,"stem":68,"icon":69},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F02.cli\u002F12.add-notification","i-lucide-bell-plus",{"title":71,"path":72,"stem":73,"icon":74},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F02.cli\u002F13.add-realtime","i-lucide-radio-tower",{"title":76,"path":77,"stem":78,"icon":79},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F02.cli\u002F14.add-seeder","i-lucide-sprout",{"title":81,"path":82,"stem":83,"icon":84},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F02.cli\u002F2.new-project","i-lucide-folder-plus",{"title":86,"path":87,"stem":88,"icon":89},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F02.cli\u002F3.new-module","i-lucide-blocks",{"title":91,"path":92,"stem":93,"icon":94},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F02.cli\u002F4.add-surface","i-lucide-layers-2",{"title":96,"path":97,"stem":98,"icon":99},"add domain","\u002Fhu\u002Fcli\u002Fadd-domain","hu\u002F02.cli\u002F5.add-domain","i-lucide-box",{"title":101,"path":102,"stem":103,"icon":104},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F02.cli\u002F6.add-handler","i-lucide-webhook",{"title":106,"path":107,"stem":108,"icon":109},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F02.cli\u002F7.new-migration","i-lucide-file-plus",{"title":111,"path":112,"stem":113,"icon":114},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F02.cli\u002F8.worker-generators","i-lucide-cog",{"title":116,"path":117,"stem":118,"icon":119},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F02.cli\u002F9.add-db","i-lucide-database-zap",{"title":121,"icon":99,"path":122,"stem":123,"children":124,"page":44},"A framework","\u002Fhu\u002Fframework","hu\u002F03.framework",[125,129,134,139,143,148,153],{"title":126,"path":127,"stem":128,"icon":99},"A framework áttekintése","\u002Fhu\u002Fframework\u002Foverview","hu\u002F03.framework\u002F1.overview",{"title":130,"path":131,"stem":132,"icon":133},"Alkalmazás-életciklus","\u002Fhu\u002Fframework\u002Fapp","hu\u002F03.framework\u002F2.app","i-lucide-power",{"title":135,"path":136,"stem":137,"icon":138},"Szerver","\u002Fhu\u002Fframework\u002Fserver","hu\u002F03.framework\u002F3.server","i-lucide-server",{"title":140,"path":141,"stem":142,"icon":114},"Worker","\u002Fhu\u002Fframework\u002Fworker","hu\u002F03.framework\u002F4.worker",{"title":144,"path":145,"stem":146,"icon":147},"Realtime","\u002Fhu\u002Fframework\u002Frealtime","hu\u002F03.framework\u002F5.realtime","i-lucide-radio",{"title":149,"path":150,"stem":151,"icon":152},"Migrációk","\u002Fhu\u002Fframework\u002Fmigrations","hu\u002F03.framework\u002F6.migrations","i-lucide-file-stack",{"title":154,"path":155,"stem":156,"icon":157},"Social login","\u002Fhu\u002Fframework\u002Fsocial-login","hu\u002F03.framework\u002F7.social-login","i-lucide-log-in",{"title":159,"icon":160,"path":161,"stem":162,"children":163,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F04.reference",[164,169],{"title":165,"path":166,"stem":167,"icon":168},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F04.reference\u002F1.configuration","i-lucide-settings",{"title":170,"path":171,"stem":172,"icon":173},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F04.reference\u002F2.dependencies","i-lucide-package",{"title":175,"icon":176,"path":177,"stem":178,"children":179,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F05.concepts",[180,185,190,194,199],{"title":181,"path":182,"stem":183,"icon":184},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F05.concepts\u002F1.architecture","i-lucide-layers",{"title":186,"path":187,"stem":188,"icon":189},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F05.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":165,"path":191,"stem":192,"icon":193},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F05.concepts\u002F3.configuration","i-lucide-settings-2",{"title":195,"path":196,"stem":197,"icon":198},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F05.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":200,"path":201,"stem":202,"icon":203},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F05.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":205,"icon":206,"path":207,"stem":208,"children":209,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F06.auth",[210,215,220,225,230],{"title":211,"path":212,"stem":213,"icon":214},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F06.auth\u002F1.overview","i-lucide-key-round",{"title":216,"path":217,"stem":218,"icon":219},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F06.auth\u002F2.rbac","i-lucide-users",{"title":221,"path":222,"stem":223,"icon":224},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F06.auth\u002F3.policy","i-lucide-gavel",{"title":226,"path":227,"stem":228,"icon":229},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F06.auth\u002F4.standalone","i-lucide-plug",{"title":231,"path":232,"stem":233,"icon":157},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F06.auth\u002F5.social-standalone",{"title":235,"icon":236,"path":237,"stem":238,"children":239,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F07.dbx",[240,243,247,251,256],{"title":52,"path":241,"stem":242,"icon":236},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F07.dbx\u002F1.overview",{"title":244,"path":245,"stem":246,"icon":229},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F07.dbx\u002F2.pg",{"title":248,"path":249,"stem":250,"icon":184},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F07.dbx\u002F3.bunx",{"title":252,"path":253,"stem":254,"icon":255},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F07.dbx\u002F4.transactions","i-lucide-git-merge",{"title":257,"path":258,"stem":259,"icon":79},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F07.dbx\u002F5.seed",{"title":261,"icon":193,"path":262,"stem":263,"children":264,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F08.envconf",[265,268],{"title":52,"path":266,"stem":267,"icon":193},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F08.envconf\u002F1.overview",{"title":269,"path":270,"stem":271,"icon":193},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F08.envconf\u002F2.recipes",{"title":273,"icon":189,"path":274,"stem":275,"children":276,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F09.errs",[277,280,284],{"title":52,"path":278,"stem":279,"icon":189},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F09.errs\u002F1.overview",{"title":281,"path":282,"stem":283,"icon":189},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F09.errs\u002F2.api",{"title":285,"path":286,"stem":287,"icon":189},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F09.errs\u002F3.integration",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F10.events",[294,298,303],{"title":295,"path":296,"stem":297,"icon":147},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F10.events\u002F1.overview",{"title":299,"path":300,"stem":301,"icon":302},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F10.events\u002F2.outbox","i-lucide-inbox",{"title":304,"path":305,"stem":306,"icon":307},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F10.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":309,"icon":310,"path":311,"stem":312,"children":313,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F11.httperr",[314,317,322],{"title":52,"path":315,"stem":316,"icon":310},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F11.httperr\u002F1.overview",{"title":318,"path":319,"stem":320,"icon":321},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F11.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":323,"path":324,"stem":325,"icon":326},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F11.httperr\u002F3.validation","i-lucide-badge-check",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"logx","i-lucide-scroll-text","\u002Fhu\u002Flogx","hu\u002F12.logx",[333,336],{"title":52,"path":334,"stem":335,"icon":329},"\u002Fhu\u002Flogx\u002Foverview","hu\u002F12.logx\u002F1.overview",{"title":337,"path":338,"stem":339,"icon":47},"Monolog-formázó","\u002Fhu\u002Flogx\u002Fmonolog","hu\u002F12.logx\u002F2.monolog",{"title":341,"icon":342,"path":343,"stem":344,"children":345,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[346,349,353],{"title":52,"path":347,"stem":348,"icon":342},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":350,"path":351,"stem":352,"icon":342},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":354,"path":355,"stem":356,"icon":342},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":358,"icon":359,"path":360,"stem":361,"children":362,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[363,366,370],{"title":52,"path":364,"stem":365,"icon":359},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":367,"path":368,"stem":369,"icon":359},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":371,"path":372,"stem":373,"icon":359},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":44},"paginate","i-lucide-list-ordered","\u002Fhu\u002Fpaginate","hu\u002F15.paginate",[380,383],{"title":52,"path":381,"stem":382,"icon":376},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F15.paginate\u002F1.overview",{"title":384,"path":385,"stem":386,"icon":39},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F15.paginate\u002F2.cursor",{"title":388,"icon":184,"path":389,"stem":390,"children":391,"page":44},"queue","\u002Fhu\u002Fqueue","hu\u002F16.queue",[392,395],{"title":52,"path":393,"stem":394,"icon":376},"\u002Fhu\u002Fqueue\u002Foverview","hu\u002F16.queue\u002F1.overview",{"title":396,"path":397,"stem":398,"icon":184},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F16.queue\u002F2.tasks",{"title":400,"icon":401,"path":402,"stem":403,"children":404,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F17.storage",[405,408,412,416,421],{"title":52,"path":406,"stem":407,"icon":401},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F17.storage\u002F1.overview",{"title":409,"path":410,"stem":411,"icon":401},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F17.storage\u002F2.disk-api",{"title":413,"path":414,"stem":415,"icon":401},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F17.storage\u002F3.local",{"title":417,"path":418,"stem":419,"icon":420},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F17.storage\u002F4.s3","i-lucide-cloud",{"title":422,"path":423,"stem":424,"icon":425},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F17.storage\u002F5.testing","i-lucide-flask-conical",{"title":427,"icon":428,"path":429,"stem":430,"children":431,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F18.telemetry",[432,435,439,444],{"title":52,"path":433,"stem":434,"icon":428},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F18.telemetry\u002F1.overview",{"title":436,"path":437,"stem":438,"icon":329},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F18.telemetry\u002F2.logging",{"title":440,"path":441,"stem":442,"icon":443},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F18.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":445,"path":446,"stem":447,"icon":448},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F18.telemetry\u002F4.sentry","i-lucide-bug",{"id":450,"title":149,"body":451,"description":1422,"extension":1423,"links":1424,"meta":1425,"navigation":1426,"path":150,"seo":1427,"stem":151,"__hash__":1428},"docs_hu\u002Fhu\u002F03.framework\u002F6.migrations.md",{"type":452,"value":453,"toc":1413},"minimark",[454,476,481,488,498,553,557,567,750,777,780,814,825,831,835,838,1125,1157,1276,1285,1299,1303,1313,1342,1346,1363,1367,1391,1395,1409],[455,456,457,458,462,463,467,468,471,472,475],"p",{},"A séma-kezelés a gpsystemben szándékosan egyszerű: ",[459,460,461],"strong",{},"időbélyeg-prefixes SQL-fájlok"," a projekt ",[464,465,466],"code",{},"migrations\u002F"," mappájában, a binárisba ágyazva, egy generált ",[464,469,470],{},"cmd\u002Fmigrate"," futtatóval. Nincs schema builder, nincs telepítendő külső eszköz: a migráció ugyanúgy ",[464,473,474],{},"go run","-nal fut, mint bármi más a projektben.",[477,478,480],"h2",{"id":479},"mi-generálódik","Mi generálódik",[455,482,483,484,487],{},"Minden új projekt ezzel indul (lásd ",[485,486,81],"a",{"href":82},"):",[489,490,495],"pre",{"className":491,"code":493,"language":494},[492],"language-text","shop\u002F\n├── cmd\u002Fmigrate\u002Fmain.go              # a futtató\n└── migrations\u002F\n    ├── embed.go                     # \u002F\u002Fgo:embed *.sql\n    ├── 20200101000000_init.sql      # üres placeholder, az első sémád helye\n    └── 20200101000100_outbox.sql    # az outbox_events tábla\n","text",[464,496,493],{"__ignoreMap":497},"",[499,500,501,517,541],"ul",{},[502,503,504,509,510,512,513,516],"li",{},[459,505,506],{},[464,507,508],{},"20200101000000_init.sql"," üres váz, csak azért, hogy a ",[464,511,470],{}," az első naptól forduljon (az embed ",[464,514,515],{},"*.sql"," mintája legalább egy fájlt vár). Ide írod az első sémádat, vagy új fájlt kérsz a CLI-től. A fix, korai időbélyeg garantálja, hogy minden későbbi, generáláskori időbélyeggel ellátott migráció utána rendeződik.",[502,518,519,524,525,528,529,532,533,536,537,540],{},[459,520,521],{},[464,522,523],{},"20200101000100_outbox.sql"," az ",[485,526,527],{"href":300},"outbox"," ",[464,530,531],{},"outbox_events"," tábláját hozza létre. A séma forrása a framework ",[464,534,535],{},"outbox.MigrationSQL"," beágyazott konstansa: az a séma, amire a relay query-jei épülnek. Régebbi, worker előtti projektekbe az ",[464,538,539],{},"add worker"," parancs írja be a soron következő időbélyeggel.",[502,542,543,548,549,552],{},[459,544,545],{},[464,546,547],{},"embed.go"," egyetlen ",[464,550,551],{},"\u002F\u002Fgo:embed *.sql"," direktíva: minden migráció a bináris része lesz, a deploy artifact önhordó.",[477,554,556],{"id":555},"a-fájlformátum","A fájlformátum",[455,558,559,560,566],{},"Sima SQL, ",[485,561,565],{"href":562,"rel":563},"https:\u002F\u002Fgithub.com\u002Fpressly\u002Fgoose",[564],"nofollow","goose","-markerekkel tagolva. Egy fájl egy migráció, fel- és leirányban:",[489,568,573],{"className":569,"code":570,"filename":571,"language":572,"meta":497,"style":497},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- +goose Up\n-- +goose StatementBegin\nCREATE TABLE products (\n    id          bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    name        text        NOT NULL,\n    price_cents bigint      NOT NULL,\n    stock       int         NOT NULL DEFAULT 0,\n    created_at  timestamptz NOT NULL DEFAULT now()\n);\n-- +goose StatementEnd\n\n-- +goose Down\n-- +goose StatementBegin\nDROP TABLE products;\n-- +goose StatementEnd\n","migrations\u002F20260720143012_create_products_and_orders.sql","sql",[464,574,575,584,590,608,636,650,663,683,704,710,716,723,729,734,745],{"__ignoreMap":497},[576,577,580],"span",{"class":578,"line":579},"line",1,[576,581,583],{"class":582},"sHwdD","-- +goose Up\n",[576,585,587],{"class":578,"line":586},2,[576,588,589],{"class":582},"-- +goose StatementBegin\n",[576,591,593,597,600,604],{"class":578,"line":592},3,[576,594,596],{"class":595},"sbssI","CREATE",[576,598,599],{"class":595}," TABLE",[576,601,603],{"class":602},"s2Zo4"," products",[576,605,607],{"class":606},"sTEyZ"," (\n",[576,609,611,614,618,621,624,627,630,633],{"class":578,"line":610},4,[576,612,613],{"class":606},"    id          ",[576,615,617],{"class":616},"spNyl","bigint",[576,619,620],{"class":595}," GENERATED",[576,622,623],{"class":595}," ALWAYS",[576,625,626],{"class":595}," AS",[576,628,629],{"class":595}," IDENTITY",[576,631,632],{"class":616}," PRIMARY KEY",[576,634,635],{"class":606},",\n",[576,637,639,642,645,648],{"class":578,"line":638},5,[576,640,641],{"class":595},"    name",[576,643,644],{"class":616},"        text",[576,646,647],{"class":595},"        NOT NULL",[576,649,635],{"class":606},[576,651,653,656,658,661],{"class":578,"line":652},6,[576,654,655],{"class":606},"    price_cents ",[576,657,617],{"class":616},[576,659,660],{"class":595},"      NOT NULL",[576,662,635],{"class":606},[576,664,666,669,672,675,678,681],{"class":578,"line":665},7,[576,667,668],{"class":606},"    stock       ",[576,670,671],{"class":616},"int",[576,673,674],{"class":595},"         NOT NULL",[576,676,677],{"class":616}," DEFAULT",[576,679,680],{"class":595}," 0",[576,682,635],{"class":606},[576,684,686,689,692,695,697,700],{"class":578,"line":685},8,[576,687,688],{"class":606},"    created_at  ",[576,690,691],{"class":616},"timestamptz",[576,693,694],{"class":595}," NOT NULL",[576,696,677],{"class":616},[576,698,699],{"class":595}," now",[576,701,703],{"class":702},"sMK4o","()\n",[576,705,707],{"class":578,"line":706},9,[576,708,709],{"class":606},");\n",[576,711,713],{"class":578,"line":712},10,[576,714,715],{"class":582},"-- +goose StatementEnd\n",[576,717,719],{"class":578,"line":718},11,[576,720,722],{"emptyLinePlaceholder":721},true,"\n",[576,724,726],{"class":578,"line":725},12,[576,727,728],{"class":582},"-- +goose Down\n",[576,730,732],{"class":578,"line":731},13,[576,733,589],{"class":582},[576,735,737,740,742],{"class":578,"line":736},14,[576,738,739],{"class":595},"DROP",[576,741,599],{"class":595},[576,743,744],{"class":606}," products;\n",[576,746,748],{"class":578,"line":747},15,[576,749,715],{"class":582},[455,751,752,753,756,757,760,761,764,765,768,769,772,773,776],{},"A ",[464,754,755],{},"+goose Up"," \u002F ",[464,758,759],{},"+goose Down"," a két irány; a ",[464,762,763],{},"StatementBegin","\u002F",[464,766,767],{},"StatementEnd"," pár azt jelöli, hogy a köztes rész egyetlen statementként fusson (enélkül a goose pontosvesszőnként darabol, ami többsoros függvényeknél, triggereknél számít). A fájlnév formátuma ",[464,770,771],{},"\u003Cidobelyeg>_nev.sql",": a 14 jegyű, UTC ",[464,774,775],{},"ÉÉÉÉHHNNOOPPMM"," időbélyeg adja a futtatási sorrendet és a verziót. Mivel az időbélyeg a generáláskori pillanatot rögzíti, nem sorszám, branch-ek között sosem ütközik.",[455,778,779],{},"Új migrációt a CLI-vel kérj: kiosztja az aktuális időbélyeget és legenerálja a vázat:",[489,781,785],{"className":782,"code":783,"language":784,"meta":497,"style":497},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem new migration create_products_and_orders\n# -> migrations\u002F20260720143012_create_products_and_orders.sql\n","sh",[464,786,787,809],{"__ignoreMap":497},[576,788,789,793,797,800,803,806],{"class":578,"line":579},[576,790,792],{"class":791},"sBMFI","go",[576,794,796],{"class":795},"sfazB"," tool",[576,798,799],{"class":795}," gpsystem",[576,801,802],{"class":795}," new",[576,804,805],{"class":795}," migration",[576,807,808],{"class":795}," create_products_and_orders\n",[576,810,811],{"class":578,"line":586},[576,812,813],{"class":582},"# -> migrations\u002F20260720143012_create_products_and_orders.sql\n",[455,815,816,817,820,821,824],{},"Régebbi, még sorszámozott sémájú projekteket (",[464,818,819],{},"00001_init.sql",", ",[464,822,823],{},"00002_outbox.sql",") sem kell migrálni: az új migrációk mostantól is helyesen, a régiek után rendeződnek, mert a goose mindkét formátumot szám szerint sorba rakja.",[455,826,827,828,830],{},"Részletek: ",[485,829,106],{"href":107},".",[477,832,834],{"id":833},"a-cmdmigrate-bináris","A cmd\u002Fmigrate bináris",[455,836,837],{},"A generált futtató rövid, és érdemes egyszer elolvasni a sajátodat, nagyjából ennyi:",[489,839,843],{"className":840,"code":841,"filename":842,"language":792,"meta":497,"style":497},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cfg := envconf.MustLoad[config]()             \u002F\u002F csak a DB_* változókat tölti\n\npool := pg.MustNewPool(ctx, cfg.DB)           \u002F\u002F ugyanaz a pgx pool, amit a seedelés is használ\ndb := stdlib.OpenDBFromPool(pool)             \u002F\u002F database\u002Fsql a pool felett\n\ngoose.SetBaseFS(migrations.FS)                \u002F\u002F a beágyazott fájlokból dolgozik\ngoose.SetDialect(\"postgres\")\n\nargs := os.Args[1:]\nif len(args) == 0 {\n    args = []string{\"up\"}                     \u002F\u002F argumentum nélkül: up\n}\ngoose.RunContext(ctx, args[0], db, \".\", args[1:]...)\n","cmd\u002Fmigrate\u002Fmain.go",[464,844,845,873,877,915,940,944,968,990,994,1017,1041,1071,1076],{"__ignoreMap":497},[576,846,847,850,853,856,858,861,864,867,870],{"class":578,"line":579},[576,848,849],{"class":606},"cfg ",[576,851,852],{"class":702},":=",[576,854,855],{"class":606}," envconf",[576,857,830],{"class":702},[576,859,860],{"class":602},"MustLoad",[576,862,863],{"class":702},"[",[576,865,866],{"class":791},"config",[576,868,869],{"class":702},"]()",[576,871,872],{"class":582},"             \u002F\u002F csak a DB_* változókat tölti\n",[576,874,875],{"class":578,"line":586},[576,876,722],{"emptyLinePlaceholder":721},[576,878,879,882,884,887,889,892,895,898,901,904,906,909,912],{"class":578,"line":592},[576,880,881],{"class":606},"pool ",[576,883,852],{"class":702},[576,885,886],{"class":606}," pg",[576,888,830],{"class":702},[576,890,891],{"class":602},"MustNewPool",[576,893,894],{"class":702},"(",[576,896,897],{"class":606},"ctx",[576,899,900],{"class":702},",",[576,902,903],{"class":606}," cfg",[576,905,830],{"class":702},[576,907,908],{"class":606},"DB",[576,910,911],{"class":702},")",[576,913,914],{"class":582},"           \u002F\u002F ugyanaz a pgx pool, amit a seedelés is használ\n",[576,916,917,920,922,925,927,930,932,935,937],{"class":578,"line":610},[576,918,919],{"class":606},"db ",[576,921,852],{"class":702},[576,923,924],{"class":606}," stdlib",[576,926,830],{"class":702},[576,928,929],{"class":602},"OpenDBFromPool",[576,931,894],{"class":702},[576,933,934],{"class":606},"pool",[576,936,911],{"class":702},[576,938,939],{"class":582},"             \u002F\u002F database\u002Fsql a pool felett\n",[576,941,942],{"class":578,"line":638},[576,943,722],{"emptyLinePlaceholder":721},[576,945,946,948,950,953,955,958,960,963,965],{"class":578,"line":652},[576,947,565],{"class":606},[576,949,830],{"class":702},[576,951,952],{"class":602},"SetBaseFS",[576,954,894],{"class":702},[576,956,957],{"class":606},"migrations",[576,959,830],{"class":702},[576,961,962],{"class":606},"FS",[576,964,911],{"class":702},[576,966,967],{"class":582},"                \u002F\u002F a beágyazott fájlokból dolgozik\n",[576,969,970,972,974,977,979,982,985,987],{"class":578,"line":665},[576,971,565],{"class":606},[576,973,830],{"class":702},[576,975,976],{"class":602},"SetDialect",[576,978,894],{"class":702},[576,980,981],{"class":702},"\"",[576,983,984],{"class":795},"postgres",[576,986,981],{"class":702},[576,988,989],{"class":702},")\n",[576,991,992],{"class":578,"line":685},[576,993,722],{"emptyLinePlaceholder":721},[576,995,996,999,1001,1004,1006,1009,1011,1014],{"class":578,"line":706},[576,997,998],{"class":606},"args ",[576,1000,852],{"class":702},[576,1002,1003],{"class":606}," os",[576,1005,830],{"class":702},[576,1007,1008],{"class":606},"Args",[576,1010,863],{"class":702},[576,1012,1013],{"class":595},"1",[576,1015,1016],{"class":702},":]\n",[576,1018,1019,1023,1026,1028,1031,1033,1036,1038],{"class":578,"line":712},[576,1020,1022],{"class":1021},"s7zQu","if",[576,1024,1025],{"class":602}," len",[576,1027,894],{"class":702},[576,1029,1030],{"class":606},"args",[576,1032,911],{"class":702},[576,1034,1035],{"class":702}," ==",[576,1037,680],{"class":595},[576,1039,1040],{"class":702}," {\n",[576,1042,1043,1046,1049,1052,1055,1058,1060,1063,1065,1068],{"class":578,"line":718},[576,1044,1045],{"class":606},"    args ",[576,1047,1048],{"class":702},"=",[576,1050,1051],{"class":702}," []",[576,1053,1054],{"class":616},"string",[576,1056,1057],{"class":702},"{",[576,1059,981],{"class":702},[576,1061,1062],{"class":795},"up",[576,1064,981],{"class":702},[576,1066,1067],{"class":702},"}",[576,1069,1070],{"class":582},"                     \u002F\u002F argumentum nélkül: up\n",[576,1072,1073],{"class":578,"line":725},[576,1074,1075],{"class":702},"}\n",[576,1077,1078,1080,1082,1085,1087,1089,1091,1094,1096,1099,1102,1105,1107,1110,1112,1114,1116,1118,1120,1122],{"class":578,"line":731},[576,1079,565],{"class":606},[576,1081,830],{"class":702},[576,1083,1084],{"class":602},"RunContext",[576,1086,894],{"class":702},[576,1088,897],{"class":606},[576,1090,900],{"class":702},[576,1092,1093],{"class":606}," args",[576,1095,863],{"class":702},[576,1097,1098],{"class":595},"0",[576,1100,1101],{"class":702},"],",[576,1103,1104],{"class":606}," db",[576,1106,900],{"class":702},[576,1108,1109],{"class":702}," \"",[576,1111,830],{"class":795},[576,1113,981],{"class":702},[576,1115,900],{"class":702},[576,1117,1093],{"class":606},[576,1119,863],{"class":702},[576,1121,1013],{"class":595},[576,1123,1124],{"class":702},":]...)\n",[455,1126,1127,1128,1134,1135,1138,1139,1142,1143,1148,1149,1152,1153,1156],{},"Vagyis: a ",[485,1129,1131],{"href":1130},"\u002Fhu\u002Fdbx\u002Foverview#config",[464,1132,1133],{},"dbx.Config","-ot tölti a ",[464,1136,1137],{},"DB_*"," env-változókból (ugyanazokból, amiket az app használ), és a goose-t ",[459,1140,1141],{},"könyvtárként"," futtatja a beágyazott fájlrendszer felett, egyetlen ",[485,1144,1145],{"href":245},[464,1146,1147],{},"dbx\u002Fpg"," pool tetején (ugyanazt, amit a seedelés is megnyit, ha a ",[464,1150,1151],{},"--seed"," flaggel vagy a ",[464,1154,1155],{},"seed"," subcommanddal hívod). A parancs egy az egyben továbbadódik a goose-nak:",[489,1158,1160],{"className":782,"code":1159,"language":784,"meta":497,"style":497},"go run .\u002Fcmd\u002Fmigrate              # = up: minden függő migráció, sorrendben\ngo run .\u002Fcmd\u002Fmigrate up\ngo run .\u002Fcmd\u002Fmigrate down         # a legutóbbi migráció visszagörgetése\ngo run .\u002Fcmd\u002Fmigrate status       # melyik fájl fut le, melyik függ még\ngo run .\u002Fcmd\u002Fmigrate version      # aktuális sémaverzió\ngo run .\u002Fcmd\u002Fmigrate up-to 3      # adott verzióig (a sorszám számként)\ngo run .\u002Fcmd\u002Fmigrate up --seed    # migrál, majd lefuttatja a seedereket\ngo run .\u002Fcmd\u002Fmigrate seed         # csak a seedereket futtatja, migráció nélkül\n",[464,1161,1162,1175,1186,1200,1214,1228,1245,1262],{"__ignoreMap":497},[576,1163,1164,1166,1169,1172],{"class":578,"line":579},[576,1165,792],{"class":791},[576,1167,1168],{"class":795}," run",[576,1170,1171],{"class":795}," .\u002Fcmd\u002Fmigrate",[576,1173,1174],{"class":582},"              # = up: minden függő migráció, sorrendben\n",[576,1176,1177,1179,1181,1183],{"class":578,"line":586},[576,1178,792],{"class":791},[576,1180,1168],{"class":795},[576,1182,1171],{"class":795},[576,1184,1185],{"class":795}," up\n",[576,1187,1188,1190,1192,1194,1197],{"class":578,"line":592},[576,1189,792],{"class":791},[576,1191,1168],{"class":795},[576,1193,1171],{"class":795},[576,1195,1196],{"class":795}," down",[576,1198,1199],{"class":582},"         # a legutóbbi migráció visszagörgetése\n",[576,1201,1202,1204,1206,1208,1211],{"class":578,"line":610},[576,1203,792],{"class":791},[576,1205,1168],{"class":795},[576,1207,1171],{"class":795},[576,1209,1210],{"class":795}," status",[576,1212,1213],{"class":582},"       # melyik fájl fut le, melyik függ még\n",[576,1215,1216,1218,1220,1222,1225],{"class":578,"line":638},[576,1217,792],{"class":791},[576,1219,1168],{"class":795},[576,1221,1171],{"class":795},[576,1223,1224],{"class":795}," version",[576,1226,1227],{"class":582},"      # aktuális sémaverzió\n",[576,1229,1230,1232,1234,1236,1239,1242],{"class":578,"line":652},[576,1231,792],{"class":791},[576,1233,1168],{"class":795},[576,1235,1171],{"class":795},[576,1237,1238],{"class":795}," up-to",[576,1240,1241],{"class":595}," 3",[576,1243,1244],{"class":582},"      # adott verzióig (a sorszám számként)\n",[576,1246,1247,1249,1251,1253,1256,1259],{"class":578,"line":665},[576,1248,792],{"class":791},[576,1250,1168],{"class":795},[576,1252,1171],{"class":795},[576,1254,1255],{"class":795}," up",[576,1257,1258],{"class":795}," --seed",[576,1260,1261],{"class":582},"    # migrál, majd lefuttatja a seedereket\n",[576,1263,1264,1266,1268,1270,1273],{"class":578,"line":685},[576,1265,792],{"class":791},[576,1267,1168],{"class":795},[576,1269,1171],{"class":795},[576,1271,1272],{"class":795}," seed",[576,1274,1275],{"class":582},"         # csak a seedereket futtatja, migráció nélkül\n",[455,1277,1278,1279,1284],{},"A goose az alkalmazott migrációkat a ",[459,1280,1281],{},[464,1282,1283],{},"goose_db_version"," táblában tartja nyilván (első futáskor hozza létre). Minden migrációs fájl tranzakcióban fut: ha egy statement hibázik, a fájl összes statementje visszagördül, és a verzió-tábla nem lép.",[455,1286,752,1287,764,1289,1291,1292,1295,1296,1298],{},[464,1288,1151],{},[464,1290,1155],{}," a projekt központi ",[464,1293,1294],{},"seeds\u002F"," package-ét futtatja le; lásd a ",[485,1297,257],{"href":258}," oldalt.",[477,1300,1302],{"id":1301},"miért-nincs-külső-migrációs-eszköz","Miért nincs külső migrációs eszköz?",[455,1304,1305,1306,1309,1310,1312],{},"A stackben nincs golang-migrate, nincs atlas, és a goose ",[459,1307,1308],{},"CLI-jét sem kell telepítened",": a goose kizárólag Go-függőségként, a saját ",[464,1311,470],{}," binárisodba fordítva fut. Ennek három következménye van:",[1314,1315,1316,1326,1336],"ol",{},[502,1317,1318,1321,1322,1325],{},[459,1319,1320],{},"A deploy artifact önhordó."," A migrációk a binárisba ágyazódnak; a CI-nek és a production-image-nek nem kell SQL-fájlokat másolnia vagy külön toolt tartalmaznia. Egy ",[464,1323,1324],{},"go build .\u002Fcmd\u002Fmigrate"," outputja mindent visz.",[502,1327,1328,1331,1332,1335],{},[459,1329,1330],{},"Nincs verzió-drift."," A migrációs futtató ugyanabból a ",[464,1333,1334],{},"go.mod","-ból jön, mint minden más: nem fordulhat elő, hogy a CI más goose-verzióval fut, mint a fejlesztői gép.",[502,1337,1338,1341],{},[459,1339,1340],{},"Sima SQL a source of truth."," Nincs DSL és nincs diff-alapú varázslat: az fut le, ami a fájlban van, és a code review pontosan azt látja.",[477,1343,1345],{"id":1344},"a-nevesített-kapcsolatok-nem-migrálódnak","A nevesített kapcsolatok nem migrálódnak",[455,1347,752,1348,1350,1351,1353,1354,1358,1359,1362],{},[464,1349,470],{}," mindig csak a projekt default ",[464,1352,1137],{}," kapcsolatát tölti be: nincs fogalma az ",[485,1355,1356],{"href":117},[464,1357,116],{}," által egy modulhoz adott nevesített kapcsolatokról. A goose verziótáblája adatbázisonkénti, és egy nevesített kapcsolat gyakran olyasmire mutat, amelynek sémáját a service nem is birtokolja (egy raktár, egy read replica, egy legacy adatbázis), ezért nincs hozzá generált futtató. Ha egy nevesített kapcsolatnak valóban saját, migrált sémára van szüksége, futtasd a goose-t kézzel ellene, vagy adj hozzá egy második ",[464,1360,1361],{},"cmd\u002Fmigrate-\u003Cnév>"," binárist, ugyanazt a mintát követve, mint a generált.",[477,1364,1366],{"id":1365},"deployment","Deployment",[499,1368,1369,1379,1385],{},[502,1370,1371,1374,1375,1378],{},[459,1372,1373],{},"A migráció fusson az app előtt, tőle külön lépésként",": init containerként, release-fázis parancsként vagy a deploy-pipeline lépéseként: ",[464,1376,1377],{},"go run .\u002Fcmd\u002Fmigrate up"," (vagy az előre fordított bináris). Az app-processz indulása nem futtat migrációt.",[502,1380,1381,1384],{},[459,1382,1383],{},"Egy futtató egyszerre."," A migrációt a deploy egyetlen lépése futtassa, ne minden replika párhuzamosan, több replika mellett az init-container-per-pod minta helyett a pipeline-lépés a jó hely.",[502,1386,1387,1390],{},[459,1388,1389],{},"Előre-kompatibilis séma."," Rolling deploynál a régi app-verzió még fut, amikor az új séma már él, additív változásokkal (új tábla, új nullable oszlop) ez magától működik; oszlop-törlést, átnevezést két deployra bonts.",[477,1392,1394],{"id":1393},"nincs-schema-builder","Nincs schema builder",[455,1396,1397,1398,1401,1402,1404,1405,1408],{},"A gpsystem tudatosan nem tartalmaz schema buildert: a migrációk sima SQL-ek. A builder hordozhatóságot ad adatbázisok között, amire itt nincs szükség (a framework PostgreSQL-re épül), cserébe elfedi, milyen DDL fut le valójában. A sima SQL-lel a PostgreSQL teljes felülete elérhető (partial indexek, ",[464,1399,1400],{},"GENERATED"," oszlopok, CTE-s backfillek), pont úgy, ahogy az adatbázis dokumentációjában áll. A ",[464,1403,523],{}," jó példa: partial index (",[464,1406,1407],{},"WHERE published_at IS NULL",") a publikálatlan sorokra, közvetlenül, absztrakciós réteg nélkül kifejezve.",[1410,1411,1412],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":497,"searchDepth":586,"depth":586,"links":1414},[1415,1416,1417,1418,1419,1420,1421],{"id":479,"depth":586,"text":480},{"id":555,"depth":586,"text":556},{"id":833,"depth":586,"text":834},{"id":1301,"depth":586,"text":1302},{"id":1344,"depth":586,"text":1345},{"id":1365,"depth":586,"text":1366},{"id":1393,"depth":586,"text":1394},"Időbélyeg-prefixes SQL-fájlok a binárisba ágyazva, saját cmd\u002Fmigrate futtatóval, külső tool nélkül.","md",null,{},{"icon":152},{"title":149,"description":1422},"nFQEu_i2PYA7x_3PHZZSaQKGo2sfbLyA334GHvqU2ZI",[1430,1432],{"title":144,"path":145,"stem":146,"description":1431,"icon":147,"children":-1},"Dedikált, horizontálisan skálázható gateway, ami élőben pusholja a notificationöket a csatlakozott klienseknek: csak szerver→kliens, centrifuge-ra épülve.",{"title":154,"path":155,"stem":156,"description":1433,"icon":157,"children":-1},"Discord, Facebook, Apple, Google és bármely más OAuth2 provider bekötése az add auth modulba.",1787346797364]