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