[{"data":1,"prerenderedAt":2326},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-dbx-bunx":442,"-hu-dbx-bunx-surround":2321},[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":418,"body":444,"description":2314,"extension":2315,"links":2316,"meta":2317,"navigation":2318,"path":419,"seo":2319,"stem":420,"__hash__":2320},"docs_hu\u002Fhu\u002F8.dbx\u002F3.bunx.md",{"type":445,"value":446,"toc":2303},"minimark",[447,487,516,521,528,550,569,573,597,743,787,791,826,843,847,875,881,1256,1265,1379,1383,1408,1669,1695,1702,1706,1727,1764,1768,1798,1802,1813,2269,2273,2299],[448,449,450,451,455,456,461,462,467,468,473,474,477,478,486],"p",{},"A ",[452,453,454],"code",{},"dbx\u002Fbunx"," a ",[457,458,459],"a",{"href":411},[452,460,405],{}," tranzakció-modelljének opcionális ",[457,463,418],{"href":464,"rel":465},"https:\u002F\u002Fbun.uptrace.dev",[466],"nofollow"," adaptere. A default ",[457,469,470],{"href":415},[452,471,472],{},"dbx\u002Fpg"," natív ",[452,475,476],{},"pgx.Tx","-et hordoz a contextben és kézzel írt SQL-lel dolgozik; egy projekt, amelyik query buildingre bunt szeretne, ehelyett ezt a csomagot köti be. A bun ",[479,480,481,482,485],"strong",{},"csak akkor kerül a binárisba, ha valaki importálja a ",[452,483,484],{},"bunx","-et",". Aki nem igényli, az teljesen bun-mentes marad.",[488,489,494],"pre",{"className":490,"code":491,"language":492,"meta":493,"style":493},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fdbx\u002Fbunx\"\n","go","",[452,495,496],{"__ignoreMap":493},[497,498,501,505,509,513],"span",{"class":499,"line":500},"line",1,[497,502,504],{"class":503},"s7zQu","import",[497,506,508],{"class":507},"sMK4o"," \"",[497,510,512],{"class":511},"sBMFI","github.com\u002Fgp-system\u002Fdbx\u002Fbunx",[497,514,515],{"class":507},"\"\n",[517,518,520],"h2",{"id":519},"mi-a-bun-és-mi-nem","Mi a bun, és mi nem",[448,522,523,524,527],{},"Legyünk őszinték a pozicionálással: a bun egy ",[479,525,526],{},"query builder struct-mapping-gel"," („ORM-lite\"), nem Eloquent. Amit megkapsz:",[529,530,531,543],"ul",{},[532,533,534,535,538,539,542],"li",{},"struct-alapú modellek (",[452,536,537],{},"bun:\"...\""," tagek), builder-stílusú query-írás (",[452,540,541],{},"NewSelect().Model(...).Where(...)","),",[532,544,545,546,549],{},"relációk betöltése (",[452,547,548],{},"Relation(...)","), bulk insert\u002Fupdate, típusos scanelés.",[448,551,552,553,556,557,560,561,564,565,568],{},"Amit ",[479,554,555],{},"nem"," kapsz meg az Eloquentből: nincs ActiveRecord (",[452,558,559],{},"$product->save()","), nincsenek modell-események (",[452,562,563],{},"creating","\u002F",[452,566,567],{},"saved","), nincs lazy loading, nincsenek accessorok\u002Fmutatorok, nincs global scope. A modell egy sima struct, a query egy explicit builder-hívás. Ez egy teljes ActiveRecord-stílusú ORM-hez képest elsőre spártainak tűnhet. Cserébe minden query ott van, ahol leírtad, és pontosan az fut le, amit látsz.",[517,570,572],{"id":571},"bekötés","Bekötés",[448,574,575,576,579,580,582,583,585,586,585,589,592,593,596],{},"A projekt-generáláskor a ",[452,577,578],{},"--db bun"," flag választja ki (lásd ",[457,581,320],{"href":321},"); a manifest rögzíti, és minden későbbi generátor (",[452,584,325],{},", ",[452,587,588],{},"add event",[452,590,591],{},"add worker",") bun-változatú kódot emittál. A generált ",[452,594,595],{},"main.go"," így drótoz:",[488,598,600],{"className":490,"code":599,"language":492,"meta":493,"style":493},"pool := pg.MustNewPool(ctx, cfg.DB)   \u002F\u002F a pool-építés közös a pgx-stackkel\nbunDB := bunx.Open(pool)\n\ndeps := shop.Dependencies{\n    DB:         bunDB,                     \u002F\u002F *bun.DB, a repositoryk ezt fogják\n    Transactor: bunx.NewTransactor(bunDB), \u002F\u002F pg.NewTransactor(pool) helyett\n}\n",[452,601,602,645,669,676,695,712,737],{"__ignoreMap":493},[497,603,604,608,611,614,617,621,624,627,630,633,635,638,641],{"class":499,"line":500},[497,605,607],{"class":606},"sTEyZ","pool ",[497,609,610],{"class":507},":=",[497,612,613],{"class":606}," pg",[497,615,616],{"class":507},".",[497,618,620],{"class":619},"s2Zo4","MustNewPool",[497,622,623],{"class":507},"(",[497,625,626],{"class":606},"ctx",[497,628,629],{"class":507},",",[497,631,632],{"class":606}," cfg",[497,634,616],{"class":507},[497,636,637],{"class":606},"DB",[497,639,640],{"class":507},")",[497,642,644],{"class":643},"sHwdD","   \u002F\u002F a pool-építés közös a pgx-stackkel\n",[497,646,648,651,653,656,658,661,663,666],{"class":499,"line":647},2,[497,649,650],{"class":606},"bunDB ",[497,652,610],{"class":507},[497,654,655],{"class":606}," bunx",[497,657,616],{"class":507},[497,659,660],{"class":619},"Open",[497,662,623],{"class":507},[497,664,665],{"class":606},"pool",[497,667,668],{"class":507},")\n",[497,670,672],{"class":499,"line":671},3,[497,673,675],{"emptyLinePlaceholder":674},true,"\n",[497,677,679,682,684,687,689,692],{"class":499,"line":678},4,[497,680,681],{"class":606},"deps ",[497,683,610],{"class":507},[497,685,686],{"class":511}," shop",[497,688,616],{"class":507},[497,690,691],{"class":511},"Dependencies",[497,693,694],{"class":507},"{\n",[497,696,698,701,704,707,709],{"class":499,"line":697},5,[497,699,700],{"class":606},"    DB",[497,702,703],{"class":507},":",[497,705,706],{"class":606},"         bunDB",[497,708,629],{"class":507},[497,710,711],{"class":643},"                     \u002F\u002F *bun.DB, a repositoryk ezt fogják\n",[497,713,715,718,720,722,724,727,729,732,734],{"class":499,"line":714},6,[497,716,717],{"class":606},"    Transactor",[497,719,703],{"class":507},[497,721,655],{"class":606},[497,723,616],{"class":507},[497,725,726],{"class":619},"NewTransactor",[497,728,623],{"class":507},[497,730,731],{"class":606},"bunDB",[497,733,542],{"class":507},[497,735,736],{"class":643}," \u002F\u002F pg.NewTransactor(pool) helyett\n",[497,738,740],{"class":499,"line":739},7,[497,741,742],{"class":507},"}\n",[448,744,450,745,748,749,752,753,756,757,760,761,767,768,770,771,774,775,778,779,782,783,786],{},[452,746,747],{},"bunx.Open"," a kapott ",[452,750,751],{},"pgxpool.Pool","-ból épít ",[452,754,755],{},"*bun.DB","-t (",[452,758,759],{},"pgdialect","-tel), így a ",[457,762,764],{"href":763},"\u002Fhu\u002Fdbx\u002Foverview#config",[452,765,766],{},"dbx.Config"," és a pool-konfiguráció újrahasznosul; a pool lezárása zárja az alatta lévő kapcsolatokat is. Az ",[452,769,660],{}," beköti a ",[452,772,773],{},"bunotel"," query hookot is: a bun query builderen át futó query-k ugyanúgy OTel spanokat bocsátanak ki (statement + idő), mint a pgx-út, és megjelennek a ",[457,776,777],{"href":189},"trace waterfallban"," és a ",[457,780,781],{"href":194},"Sentryben",". A ",[452,784,785],{},"bunx.Conn","-on futó nyers SQL megkerüli ezt a hookot (lásd lentebb).",[517,788,790],{"id":789},"a-transactor-kontrakt-azonos","A Transactor kontrakt azonos",[448,792,450,793,796,797,803,804,806,807,810,811,813,814,817,818,821,822,825],{},[452,794,795],{},"bunx.NewTransactor"," ugyanazt a ",[457,798,800],{"href":799},"\u002Fhu\u002Fdbx\u002Foverview#transactor",[452,801,802],{},"dbx.Transactor"," interfészt adja, mint a ",[452,805,472],{},": ",[452,808,809],{},"nil","-re commit, hibára vagy panicre rollback, beágyazott hívás a külső tranzakcióhoz csatlakozik (lapos nesting, a legkülső hívás commitol). A különbség csak a hordozott típus: ",[452,812,476],{}," helyett ",[452,815,816],{},"bun.Tx"," utazik a contextben, a ",[452,819,820],{},"bunx.ContextWithTx"," \u002F ",[452,823,824],{},"bunx.TxFromContext"," párral.",[448,827,828,829,832,833,835,836,839,840,842],{},"Ez azt jelenti, hogy a ",[479,830,831],{},"service-réteged nem változik",", ha implementációt váltasz: a ",[457,834,422],{"href":423}," oldal ",[452,837,838],{},"PlaceOrder"," service-e betűre ugyanaz pgx-en és bunon, csak a ",[452,841,595],{}," bekötése és a repositoryk belseje különbözik.",[517,844,846],{"id":845},"repositoryk","Repositoryk",[448,848,849,850,585,853,856,857,860,861,863,864,867,868,870,871,874],{},"A bun query builder metódusai (",[452,851,852],{},"NewSelect",[452,854,855],{},"NewInsert",", …) nem kapnak contextet, ezért a repository a query-felületet a contextből oldja fel minden metódus tetején. A ",[452,858,859],{},"bunx.From"," a contextben utazó ",[452,862,816],{},"-et adja vissza (ha a ",[452,865,866],{},"WithinTransaction"," nyitott egyet), különben a root ",[452,869,755],{},"-t, mindkettő ",[452,872,873],{},"bun.IDB",", így a hívó egységesen használja.",[448,876,450,877,880],{},[457,878,879],{"href":41},"shop"," termék-repositoryja bunnal:",[488,882,884],{"className":490,"code":883,"language":492,"meta":493,"style":493},"package repository\n\ntype Product struct {\n    bun.BaseModel `bun:\"table:products\"`\n\n    ID         int64     `bun:\"id,pk,autoincrement\"`\n    Name       string    `bun:\"name,notnull\"`\n    PriceCents int64     `bun:\"price_cents,notnull\"`\n    Stock      int       `bun:\"stock,notnull\"`\n    CreatedAt  time.Time `bun:\"created_at,notnull\"`\n}\n\ntype ProductRepository struct {\n    db *bun.DB\n}\n\nfunc (r *ProductRepository) ListProducts(ctx context.Context, limit int) ([]Product, error) {\n    var products []Product\n    err := bunx.From(ctx, r.db).NewSelect().Model(&products).\n        OrderExpr(\"created_at DESC, id DESC\").\n        Limit(limit).\n        Scan(ctx)\n    return products, err\n}\n",[452,885,886,894,898,912,932,936,953,969,984,1001,1022,1027,1032,1044,1060,1065,1070,1130,1145,1194,1212,1225,1237,1251],{"__ignoreMap":493},[497,887,888,891],{"class":499,"line":500},[497,889,890],{"class":507},"package",[497,892,893],{"class":511}," repository\n",[497,895,896],{"class":499,"line":647},[497,897,675],{"emptyLinePlaceholder":674},[497,899,900,903,906,909],{"class":499,"line":671},[497,901,902],{"class":507},"type",[497,904,905],{"class":511}," Product",[497,907,908],{"class":507}," struct",[497,910,911],{"class":507}," {\n",[497,913,914,917,919,922,925,929],{"class":499,"line":678},[497,915,916],{"class":511},"    bun",[497,918,616],{"class":507},[497,920,921],{"class":511},"BaseModel",[497,923,924],{"class":507}," `",[497,926,928],{"class":927},"sfazB","bun:\"table:products\"",[497,930,931],{"class":507},"`\n",[497,933,934],{"class":499,"line":697},[497,935,675],{"emptyLinePlaceholder":674},[497,937,938,941,945,948,951],{"class":499,"line":714},[497,939,940],{"class":606},"    ID         ",[497,942,944],{"class":943},"spNyl","int64",[497,946,947],{"class":507},"     `",[497,949,950],{"class":927},"bun:\"id,pk,autoincrement\"",[497,952,931],{"class":507},[497,954,955,958,961,964,967],{"class":499,"line":739},[497,956,957],{"class":606},"    Name       ",[497,959,960],{"class":943},"string",[497,962,963],{"class":507},"    `",[497,965,966],{"class":927},"bun:\"name,notnull\"",[497,968,931],{"class":507},[497,970,972,975,977,979,982],{"class":499,"line":971},8,[497,973,974],{"class":606},"    PriceCents ",[497,976,944],{"class":943},[497,978,947],{"class":507},[497,980,981],{"class":927},"bun:\"price_cents,notnull\"",[497,983,931],{"class":507},[497,985,987,990,993,996,999],{"class":499,"line":986},9,[497,988,989],{"class":606},"    Stock      ",[497,991,992],{"class":943},"int",[497,994,995],{"class":507},"       `",[497,997,998],{"class":927},"bun:\"stock,notnull\"",[497,1000,931],{"class":507},[497,1002,1004,1007,1010,1012,1015,1017,1020],{"class":499,"line":1003},10,[497,1005,1006],{"class":606},"    CreatedAt  ",[497,1008,1009],{"class":511},"time",[497,1011,616],{"class":507},[497,1013,1014],{"class":511},"Time",[497,1016,924],{"class":507},[497,1018,1019],{"class":927},"bun:\"created_at,notnull\"",[497,1021,931],{"class":507},[497,1023,1025],{"class":499,"line":1024},11,[497,1026,742],{"class":507},[497,1028,1030],{"class":499,"line":1029},12,[497,1031,675],{"emptyLinePlaceholder":674},[497,1033,1035,1037,1040,1042],{"class":499,"line":1034},13,[497,1036,902],{"class":507},[497,1038,1039],{"class":511}," ProductRepository",[497,1041,908],{"class":507},[497,1043,911],{"class":507},[497,1045,1047,1050,1053,1055,1057],{"class":499,"line":1046},14,[497,1048,1049],{"class":606},"    db ",[497,1051,1052],{"class":507},"*",[497,1054,418],{"class":511},[497,1056,616],{"class":507},[497,1058,1059],{"class":511},"DB\n",[497,1061,1063],{"class":499,"line":1062},15,[497,1064,742],{"class":507},[497,1066,1068],{"class":499,"line":1067},16,[497,1069,675],{"emptyLinePlaceholder":674},[497,1071,1073,1076,1079,1083,1085,1088,1090,1093,1095,1097,1100,1102,1105,1107,1110,1113,1115,1118,1121,1123,1126,1128],{"class":499,"line":1072},17,[497,1074,1075],{"class":507},"func",[497,1077,1078],{"class":507}," (",[497,1080,1082],{"class":1081},"sHdIc","r ",[497,1084,1052],{"class":507},[497,1086,1087],{"class":511},"ProductRepository",[497,1089,640],{"class":507},[497,1091,1092],{"class":619}," ListProducts",[497,1094,623],{"class":507},[497,1096,626],{"class":1081},[497,1098,1099],{"class":511}," context",[497,1101,616],{"class":507},[497,1103,1104],{"class":511},"Context",[497,1106,629],{"class":507},[497,1108,1109],{"class":1081}," limit",[497,1111,1112],{"class":943}," int",[497,1114,640],{"class":507},[497,1116,1117],{"class":507}," ([]",[497,1119,1120],{"class":511},"Product",[497,1122,629],{"class":507},[497,1124,1125],{"class":943}," error",[497,1127,640],{"class":507},[497,1129,911],{"class":507},[497,1131,1133,1136,1139,1142],{"class":499,"line":1132},18,[497,1134,1135],{"class":507},"    var",[497,1137,1138],{"class":606}," products ",[497,1140,1141],{"class":507},"[]",[497,1143,1144],{"class":511},"Product\n",[497,1146,1148,1151,1153,1155,1157,1160,1162,1164,1166,1169,1171,1174,1177,1179,1182,1185,1188,1191],{"class":499,"line":1147},19,[497,1149,1150],{"class":606},"    err ",[497,1152,610],{"class":507},[497,1154,655],{"class":606},[497,1156,616],{"class":507},[497,1158,1159],{"class":619},"From",[497,1161,623],{"class":507},[497,1163,626],{"class":606},[497,1165,629],{"class":507},[497,1167,1168],{"class":606}," r",[497,1170,616],{"class":507},[497,1172,1173],{"class":606},"db",[497,1175,1176],{"class":507},").",[497,1178,852],{"class":619},[497,1180,1181],{"class":507},"().",[497,1183,1184],{"class":619},"Model",[497,1186,1187],{"class":507},"(&",[497,1189,1190],{"class":606},"products",[497,1192,1193],{"class":507},").\n",[497,1195,1197,1200,1202,1205,1208,1210],{"class":499,"line":1196},20,[497,1198,1199],{"class":619},"        OrderExpr",[497,1201,623],{"class":507},[497,1203,1204],{"class":507},"\"",[497,1206,1207],{"class":927},"created_at DESC, id DESC",[497,1209,1204],{"class":507},[497,1211,1193],{"class":507},[497,1213,1215,1218,1220,1223],{"class":499,"line":1214},21,[497,1216,1217],{"class":619},"        Limit",[497,1219,623],{"class":507},[497,1221,1222],{"class":606},"limit",[497,1224,1193],{"class":507},[497,1226,1228,1231,1233,1235],{"class":499,"line":1227},22,[497,1229,1230],{"class":619},"        Scan",[497,1232,623],{"class":507},[497,1234,626],{"class":606},[497,1236,668],{"class":507},[497,1238,1240,1243,1246,1248],{"class":499,"line":1239},23,[497,1241,1242],{"class":503},"    return",[497,1244,1245],{"class":606}," products",[497,1247,629],{"class":507},[497,1249,1250],{"class":606}," err\n",[497,1252,1254],{"class":499,"line":1253},24,[497,1255,742],{"class":507},[448,1257,1258,1259,1261,1262,1264],{},"A rendelés-insert, a ",[452,1260,838],{}," tranzakciójából hívva, automatikusan a ",[452,1263,816],{},"-en fut:",[488,1266,1268],{"className":490,"code":1267,"language":492,"meta":493,"style":493},"func (r *OrderRepository) Insert(ctx context.Context, o *Order) error {\n    _, err := bunx.From(ctx, r.db).NewInsert().Model(o).Exec(ctx)\n    return err\n}\n",[452,1269,1270,1315,1369,1375],{"__ignoreMap":493},[497,1271,1272,1274,1276,1278,1280,1283,1285,1288,1290,1292,1294,1296,1298,1300,1303,1306,1309,1311,1313],{"class":499,"line":500},[497,1273,1075],{"class":507},[497,1275,1078],{"class":507},[497,1277,1082],{"class":1081},[497,1279,1052],{"class":507},[497,1281,1282],{"class":511},"OrderRepository",[497,1284,640],{"class":507},[497,1286,1287],{"class":619}," Insert",[497,1289,623],{"class":507},[497,1291,626],{"class":1081},[497,1293,1099],{"class":511},[497,1295,616],{"class":507},[497,1297,1104],{"class":511},[497,1299,629],{"class":507},[497,1301,1302],{"class":1081}," o",[497,1304,1305],{"class":507}," *",[497,1307,1308],{"class":511},"Order",[497,1310,640],{"class":507},[497,1312,1125],{"class":943},[497,1314,911],{"class":507},[497,1316,1317,1320,1322,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1358,1360,1363,1365,1367],{"class":499,"line":647},[497,1318,1319],{"class":606},"    _",[497,1321,629],{"class":507},[497,1323,1324],{"class":606}," err ",[497,1326,610],{"class":507},[497,1328,655],{"class":606},[497,1330,616],{"class":507},[497,1332,1159],{"class":619},[497,1334,623],{"class":507},[497,1336,626],{"class":606},[497,1338,629],{"class":507},[497,1340,1168],{"class":606},[497,1342,616],{"class":507},[497,1344,1173],{"class":606},[497,1346,1176],{"class":507},[497,1348,855],{"class":619},[497,1350,1181],{"class":507},[497,1352,1184],{"class":619},[497,1354,623],{"class":507},[497,1356,1357],{"class":606},"o",[497,1359,1176],{"class":507},[497,1361,1362],{"class":619},"Exec",[497,1364,623],{"class":507},[497,1366,626],{"class":606},[497,1368,668],{"class":507},[497,1370,1371,1373],{"class":499,"line":671},[497,1372,1242],{"class":503},[497,1374,1250],{"class":606},[497,1376,1377],{"class":499,"line":678},[497,1378,742],{"class":507},[517,1380,1382],{"id":1381},"raw-sql-és-sqlc-a-conn-resolver","Raw SQL és sqlc: a Conn resolver",[448,1384,1385,1386,1388,1389,1392,1393,1396,1397,1400,1401,1403,1404,1407],{},"Mivel a ",[452,1387,816],{}," beágyaz egy ",[452,1390,1391],{},"*sql.Tx","-et, a nyers SQL és a sqlc (",[452,1394,1395],{},"database\u002Fsql"," módban) ",[479,1398,1399],{},"ugyanabba a tranzakcióba"," csatlakozhat a ",[452,1402,785],{},"-on keresztül. A shop készletcsökkentése: atomikus ",[452,1405,1406],{},"UPDATE",", amit builderrel körülményes lenne kifejezni:",[488,1409,1411],{"className":490,"code":1410,"language":492,"meta":493,"style":493},"func (r *ProductRepository) DecrementStock(ctx context.Context, productID int64, qty int) error {\n    res, err := bunx.Conn(ctx, r.db).ExecContext(ctx,\n        `UPDATE products SET stock = stock - $2 WHERE id = $1 AND stock >= $2`,\n        productID, qty)\n    if err != nil {\n        return err\n    }\n    if n, _ := res.RowsAffected(); n == 0 {\n        return errs.New(\"insufficient stock\",\n            errs.Code(\"insufficient_stock\"), errs.Public(\"A termék elfogyott.\"))\n    }\n    return nil\n}\n",[452,1412,1413,1461,1503,1516,1527,1542,1549,1554,1591,1614,1654,1658,1665],{"__ignoreMap":493},[497,1414,1415,1417,1419,1421,1423,1425,1427,1430,1432,1434,1436,1438,1440,1442,1445,1448,1450,1453,1455,1457,1459],{"class":499,"line":500},[497,1416,1075],{"class":507},[497,1418,1078],{"class":507},[497,1420,1082],{"class":1081},[497,1422,1052],{"class":507},[497,1424,1087],{"class":511},[497,1426,640],{"class":507},[497,1428,1429],{"class":619}," DecrementStock",[497,1431,623],{"class":507},[497,1433,626],{"class":1081},[497,1435,1099],{"class":511},[497,1437,616],{"class":507},[497,1439,1104],{"class":511},[497,1441,629],{"class":507},[497,1443,1444],{"class":1081}," productID",[497,1446,1447],{"class":943}," int64",[497,1449,629],{"class":507},[497,1451,1452],{"class":1081}," qty",[497,1454,1112],{"class":943},[497,1456,640],{"class":507},[497,1458,1125],{"class":943},[497,1460,911],{"class":507},[497,1462,1463,1466,1468,1470,1472,1474,1476,1479,1481,1483,1485,1487,1489,1491,1493,1496,1498,1500],{"class":499,"line":647},[497,1464,1465],{"class":606},"    res",[497,1467,629],{"class":507},[497,1469,1324],{"class":606},[497,1471,610],{"class":507},[497,1473,655],{"class":606},[497,1475,616],{"class":507},[497,1477,1478],{"class":619},"Conn",[497,1480,623],{"class":507},[497,1482,626],{"class":606},[497,1484,629],{"class":507},[497,1486,1168],{"class":606},[497,1488,616],{"class":507},[497,1490,1173],{"class":606},[497,1492,1176],{"class":507},[497,1494,1495],{"class":619},"ExecContext",[497,1497,623],{"class":507},[497,1499,626],{"class":606},[497,1501,1502],{"class":507},",\n",[497,1504,1505,1508,1511,1514],{"class":499,"line":671},[497,1506,1507],{"class":507},"        `",[497,1509,1510],{"class":927},"UPDATE products SET stock = stock - $2 WHERE id = $1 AND stock >= $2",[497,1512,1513],{"class":507},"`",[497,1515,1502],{"class":507},[497,1517,1518,1521,1523,1525],{"class":499,"line":678},[497,1519,1520],{"class":606},"        productID",[497,1522,629],{"class":507},[497,1524,1452],{"class":606},[497,1526,668],{"class":507},[497,1528,1529,1532,1534,1537,1540],{"class":499,"line":697},[497,1530,1531],{"class":503},"    if",[497,1533,1324],{"class":606},[497,1535,1536],{"class":507},"!=",[497,1538,1539],{"class":507}," nil",[497,1541,911],{"class":507},[497,1543,1544,1547],{"class":499,"line":714},[497,1545,1546],{"class":503},"        return",[497,1548,1250],{"class":606},[497,1550,1551],{"class":499,"line":739},[497,1552,1553],{"class":507},"    }\n",[497,1555,1556,1558,1561,1563,1566,1568,1571,1573,1576,1579,1582,1585,1589],{"class":499,"line":971},[497,1557,1531],{"class":503},[497,1559,1560],{"class":606}," n",[497,1562,629],{"class":507},[497,1564,1565],{"class":606}," _ ",[497,1567,610],{"class":507},[497,1569,1570],{"class":606}," res",[497,1572,616],{"class":507},[497,1574,1575],{"class":619},"RowsAffected",[497,1577,1578],{"class":507},"();",[497,1580,1581],{"class":606}," n ",[497,1583,1584],{"class":507},"==",[497,1586,1588],{"class":1587},"sbssI"," 0",[497,1590,911],{"class":507},[497,1592,1593,1595,1598,1600,1603,1605,1607,1610,1612],{"class":499,"line":986},[497,1594,1546],{"class":503},[497,1596,1597],{"class":606}," errs",[497,1599,616],{"class":507},[497,1601,1602],{"class":619},"New",[497,1604,623],{"class":507},[497,1606,1204],{"class":507},[497,1608,1609],{"class":927},"insufficient stock",[497,1611,1204],{"class":507},[497,1613,1502],{"class":507},[497,1615,1616,1619,1621,1624,1626,1628,1631,1633,1635,1637,1639,1642,1644,1646,1649,1651],{"class":499,"line":1003},[497,1617,1618],{"class":606},"            errs",[497,1620,616],{"class":507},[497,1622,1623],{"class":619},"Code",[497,1625,623],{"class":507},[497,1627,1204],{"class":507},[497,1629,1630],{"class":927},"insufficient_stock",[497,1632,1204],{"class":507},[497,1634,542],{"class":507},[497,1636,1597],{"class":606},[497,1638,616],{"class":507},[497,1640,1641],{"class":619},"Public",[497,1643,623],{"class":507},[497,1645,1204],{"class":507},[497,1647,1648],{"class":927},"A termék elfogyott.",[497,1650,1204],{"class":507},[497,1652,1653],{"class":507},"))\n",[497,1655,1656],{"class":499,"line":1024},[497,1657,1553],{"class":507},[497,1659,1660,1662],{"class":499,"line":1029},[497,1661,1242],{"class":503},[497,1663,1664],{"class":507}," nil\n",[497,1666,1667],{"class":499,"line":1034},[497,1668,742],{"class":507},[448,1670,450,1671,1673,1674,1677,1678,821,1680,1683,1684,1687,1688,1691,1692,1694],{},[452,1672,785],{}," szándékosan a ",[479,1675,1676],{},"nyers"," ",[452,1679,1391],{},[452,1681,1682],{},"*sql.DB","-t adja vissza, nem a bun wrappert. A bun wrapper minden query-t átformáz a saját placeholder-szintaxisára (",[452,1685,1686],{},"?","), ami eltörné a natív ",[452,1689,1690],{},"$N"," placeholdereket, így a sqlc által generált postgres-SQL is változatlanul fut. Cserébe az ezen az úton futó query-k kihagyják a bun query-hookjait (otel\u002Flogging); aki azokat akarja, a bun buildert használja a ",[452,1693,1159],{},"-on át.",[1696,1697,1698,1699,616],"note",{},"Az „egy tranzakció, két query-stílus\" garanciát (bun builder + raw SQL, közös commit\u002Frollback) a dbx saját integrációs tesztjei rögzítik valós PostgreSQL ellen: ",[452,1700,1701],{},"go test -tags=integration .\u002Fdbx\u002Fbunx\u002F",[517,1703,1705],{"id":1704},"outbox-bun-alatt","Outbox bun alatt",[448,1707,1708,1709,1712,1713,1716,1717,1720,1721,1723,1724,1726],{},"Az ",[457,1710,1711],{"href":73},"outbox"," store-nak is van bun-adaptere, ugyanezt a splitet tükrözve: a bun-projektek a ",[452,1714,1715],{},"github.com\u002Fgp-system\u002Fevents\u002Foutbox\u002Fbunx"," csomag ",[452,1718,1719],{},"NewStore(bunDB)","-jét kötik be, így az outbox-insert a ",[452,1722,866],{}," által nyitott bun-tranzakcióhoz csatlakozik. A generátor ezt automatikusan így drótozza ",[452,1725,578],{}," projektekben:",[488,1728,1730],{"className":490,"code":1729,"language":492,"meta":493,"style":493},"Dispatcher: outbox.NewDispatcher(outboxbunx.NewStore(bunDB)),\n",[452,1731,1732],{"__ignoreMap":493},[497,1733,1734,1737,1739,1742,1744,1747,1749,1752,1754,1757,1759,1761],{"class":499,"line":500},[497,1735,1736],{"class":606},"Dispatcher",[497,1738,703],{"class":507},[497,1740,1741],{"class":606}," outbox",[497,1743,616],{"class":507},[497,1745,1746],{"class":619},"NewDispatcher",[497,1748,623],{"class":507},[497,1750,1751],{"class":606},"outboxbunx",[497,1753,616],{"class":507},[497,1755,1756],{"class":619},"NewStore",[497,1758,623],{"class":507},[497,1760,731],{"class":606},[497,1762,1763],{"class":507},")),\n",[517,1765,1767],{"id":1766},"korlát","Korlát",[448,1769,1770,1771,1773,1774,1677,1776,1778,1779,1782,1783,1785,1786,1789,1790,1793,1794,1797],{},"Egy projekten belül a ",[452,1772,484],{}," és a pgx-natív executor (a ",[452,1775,472],{},[452,1777,637],{},"-je) ",[479,1780,1781],{},"nem oszthat egy tranzakciót",": a két absztrakció külön úton checkoutolja a kapcsolatokat, és külön context-kulcsban hordozza a tranzakciót. Bun-projektben a nyers SQL a ",[452,1784,785],{},"-on megy, sosem a ",[452,1787,1788],{},"pg.NewDB(pool)","-on. A ",[457,1791,1792],{"href":273},"migrációk"," ettől függetlenek: mindkét stack alatt ugyanaz a ",[452,1795,1796],{},"cmd\u002Fmigrate"," bináris fut.",[517,1799,1801],{"id":1800},"önálló-példa","Önálló példa",[448,1803,450,1804,1806,1807,1809,1810,1812],{},[452,1805,454],{},"-hez sem kell semmi a kitből: az ",[452,1808,660],{},", a ",[452,1811,1159],{}," és egy transactor önmagában is elég.",[488,1814,1816],{"className":490,"code":1815,"filename":595,"language":492,"meta":493,"style":493},"package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\"\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fbunx\"\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n)\n\nfunc main() {\n    ctx := context.Background()\n    pool := pg.MustNewPool(ctx, dbx.Config{\n        Host: \"localhost\", Port: 5432,\n        User: \"shop\", Password: \"secret\", Database: \"shop\",\n    })\n    defer pool.Close()\n\n    bunDB := bunx.Open(pool)\n    tx := bunx.NewTransactor(bunDB)\n\n    err := tx.WithinTransaction(ctx, func(ctx context.Context) error {\n        _, err := bunx.From(ctx, bunDB).NewUpdate().\n            Table(\"products\").Set(\"stock = stock - 1\").Where(\"id = ?\", \"prod_42\").Exec(ctx)\n        return err\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n",[452,1817,1818,1825,1829,1836,1846,1855,1859,1868,1876,1885,1889,1893,1905,1922,1951,1977,2019,2024,2039,2043,2062,2081,2085,2121,2155,2216,2223,2228,2241,2259,2264],{"__ignoreMap":493},[497,1819,1820,1822],{"class":499,"line":500},[497,1821,890],{"class":507},[497,1823,1824],{"class":511}," main\n",[497,1826,1827],{"class":499,"line":647},[497,1828,675],{"emptyLinePlaceholder":674},[497,1830,1831,1833],{"class":499,"line":671},[497,1832,504],{"class":503},[497,1834,1835],{"class":507}," (\n",[497,1837,1838,1841,1844],{"class":499,"line":678},[497,1839,1840],{"class":507},"    \"",[497,1842,1843],{"class":511},"context",[497,1845,515],{"class":507},[497,1847,1848,1850,1853],{"class":499,"line":697},[497,1849,1840],{"class":507},[497,1851,1852],{"class":511},"log",[497,1854,515],{"class":507},[497,1856,1857],{"class":499,"line":714},[497,1858,675],{"emptyLinePlaceholder":674},[497,1860,1861,1863,1866],{"class":499,"line":739},[497,1862,1840],{"class":507},[497,1864,1865],{"class":511},"github.com\u002Fgp-system\u002Fdbx",[497,1867,515],{"class":507},[497,1869,1870,1872,1874],{"class":499,"line":971},[497,1871,1840],{"class":507},[497,1873,512],{"class":511},[497,1875,515],{"class":507},[497,1877,1878,1880,1883],{"class":499,"line":986},[497,1879,1840],{"class":507},[497,1881,1882],{"class":511},"github.com\u002Fgp-system\u002Fdbx\u002Fpg",[497,1884,515],{"class":507},[497,1886,1887],{"class":499,"line":1003},[497,1888,668],{"class":507},[497,1890,1891],{"class":499,"line":1024},[497,1892,675],{"emptyLinePlaceholder":674},[497,1894,1895,1897,1900,1903],{"class":499,"line":1029},[497,1896,1075],{"class":507},[497,1898,1899],{"class":619}," main",[497,1901,1902],{"class":507},"()",[497,1904,911],{"class":507},[497,1906,1907,1910,1912,1914,1916,1919],{"class":499,"line":1034},[497,1908,1909],{"class":606},"    ctx ",[497,1911,610],{"class":507},[497,1913,1099],{"class":606},[497,1915,616],{"class":507},[497,1917,1918],{"class":619},"Background",[497,1920,1921],{"class":507},"()\n",[497,1923,1924,1927,1929,1931,1933,1935,1937,1939,1941,1944,1946,1949],{"class":499,"line":1046},[497,1925,1926],{"class":606},"    pool ",[497,1928,610],{"class":507},[497,1930,613],{"class":606},[497,1932,616],{"class":507},[497,1934,620],{"class":619},[497,1936,623],{"class":507},[497,1938,626],{"class":606},[497,1940,629],{"class":507},[497,1942,1943],{"class":511}," dbx",[497,1945,616],{"class":507},[497,1947,1948],{"class":511},"Config",[497,1950,694],{"class":507},[497,1952,1953,1956,1958,1960,1963,1965,1967,1970,1972,1975],{"class":499,"line":1062},[497,1954,1955],{"class":606},"        Host",[497,1957,703],{"class":507},[497,1959,508],{"class":507},[497,1961,1962],{"class":927},"localhost",[497,1964,1204],{"class":507},[497,1966,629],{"class":507},[497,1968,1969],{"class":606}," Port",[497,1971,703],{"class":507},[497,1973,1974],{"class":1587}," 5432",[497,1976,1502],{"class":507},[497,1978,1979,1982,1984,1986,1988,1990,1992,1995,1997,1999,2002,2004,2006,2009,2011,2013,2015,2017],{"class":499,"line":1067},[497,1980,1981],{"class":606},"        User",[497,1983,703],{"class":507},[497,1985,508],{"class":507},[497,1987,879],{"class":927},[497,1989,1204],{"class":507},[497,1991,629],{"class":507},[497,1993,1994],{"class":606}," Password",[497,1996,703],{"class":507},[497,1998,508],{"class":507},[497,2000,2001],{"class":927},"secret",[497,2003,1204],{"class":507},[497,2005,629],{"class":507},[497,2007,2008],{"class":606}," Database",[497,2010,703],{"class":507},[497,2012,508],{"class":507},[497,2014,879],{"class":927},[497,2016,1204],{"class":507},[497,2018,1502],{"class":507},[497,2020,2021],{"class":499,"line":1072},[497,2022,2023],{"class":507},"    })\n",[497,2025,2026,2029,2032,2034,2037],{"class":499,"line":1132},[497,2027,2028],{"class":503},"    defer",[497,2030,2031],{"class":606}," pool",[497,2033,616],{"class":507},[497,2035,2036],{"class":619},"Close",[497,2038,1921],{"class":507},[497,2040,2041],{"class":499,"line":1147},[497,2042,675],{"emptyLinePlaceholder":674},[497,2044,2045,2048,2050,2052,2054,2056,2058,2060],{"class":499,"line":1196},[497,2046,2047],{"class":606},"    bunDB ",[497,2049,610],{"class":507},[497,2051,655],{"class":606},[497,2053,616],{"class":507},[497,2055,660],{"class":619},[497,2057,623],{"class":507},[497,2059,665],{"class":606},[497,2061,668],{"class":507},[497,2063,2064,2067,2069,2071,2073,2075,2077,2079],{"class":499,"line":1214},[497,2065,2066],{"class":606},"    tx ",[497,2068,610],{"class":507},[497,2070,655],{"class":606},[497,2072,616],{"class":507},[497,2074,726],{"class":619},[497,2076,623],{"class":507},[497,2078,731],{"class":606},[497,2080,668],{"class":507},[497,2082,2083],{"class":499,"line":1227},[497,2084,675],{"emptyLinePlaceholder":674},[497,2086,2087,2089,2091,2094,2096,2098,2100,2102,2104,2107,2109,2111,2113,2115,2117,2119],{"class":499,"line":1239},[497,2088,1150],{"class":606},[497,2090,610],{"class":507},[497,2092,2093],{"class":606}," tx",[497,2095,616],{"class":507},[497,2097,866],{"class":619},[497,2099,623],{"class":507},[497,2101,626],{"class":606},[497,2103,629],{"class":507},[497,2105,2106],{"class":507}," func(",[497,2108,626],{"class":1081},[497,2110,1099],{"class":511},[497,2112,616],{"class":507},[497,2114,1104],{"class":511},[497,2116,640],{"class":507},[497,2118,1125],{"class":943},[497,2120,911],{"class":507},[497,2122,2123,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144,2147,2149,2152],{"class":499,"line":1253},[497,2124,2125],{"class":606},"        _",[497,2127,629],{"class":507},[497,2129,1324],{"class":606},[497,2131,610],{"class":507},[497,2133,655],{"class":606},[497,2135,616],{"class":507},[497,2137,1159],{"class":619},[497,2139,623],{"class":507},[497,2141,626],{"class":606},[497,2143,629],{"class":507},[497,2145,2146],{"class":606}," bunDB",[497,2148,1176],{"class":507},[497,2150,2151],{"class":619},"NewUpdate",[497,2153,2154],{"class":507},"().\n",[497,2156,2158,2161,2163,2165,2167,2169,2171,2174,2176,2178,2181,2183,2185,2188,2190,2192,2195,2197,2199,2201,2204,2206,2208,2210,2212,2214],{"class":499,"line":2157},25,[497,2159,2160],{"class":619},"            Table",[497,2162,623],{"class":507},[497,2164,1204],{"class":507},[497,2166,1190],{"class":927},[497,2168,1204],{"class":507},[497,2170,1176],{"class":507},[497,2172,2173],{"class":619},"Set",[497,2175,623],{"class":507},[497,2177,1204],{"class":507},[497,2179,2180],{"class":927},"stock = stock - 1",[497,2182,1204],{"class":507},[497,2184,1176],{"class":507},[497,2186,2187],{"class":619},"Where",[497,2189,623],{"class":507},[497,2191,1204],{"class":507},[497,2193,2194],{"class":927},"id = ?",[497,2196,1204],{"class":507},[497,2198,629],{"class":507},[497,2200,508],{"class":507},[497,2202,2203],{"class":927},"prod_42",[497,2205,1204],{"class":507},[497,2207,1176],{"class":507},[497,2209,1362],{"class":619},[497,2211,623],{"class":507},[497,2213,626],{"class":606},[497,2215,668],{"class":507},[497,2217,2219,2221],{"class":499,"line":2218},26,[497,2220,1546],{"class":503},[497,2222,1250],{"class":606},[497,2224,2226],{"class":499,"line":2225},27,[497,2227,2023],{"class":507},[497,2229,2231,2233,2235,2237,2239],{"class":499,"line":2230},28,[497,2232,1531],{"class":503},[497,2234,1324],{"class":606},[497,2236,1536],{"class":507},[497,2238,1539],{"class":507},[497,2240,911],{"class":507},[497,2242,2244,2247,2249,2252,2254,2257],{"class":499,"line":2243},29,[497,2245,2246],{"class":606},"        log",[497,2248,616],{"class":507},[497,2250,2251],{"class":619},"Fatal",[497,2253,623],{"class":507},[497,2255,2256],{"class":606},"err",[497,2258,668],{"class":507},[497,2260,2262],{"class":499,"line":2261},30,[497,2263,1553],{"class":507},[497,2265,2267],{"class":499,"line":2266},31,[497,2268,742],{"class":507},[517,2270,2272],{"id":2271},"használt-patternek","Használt patternek",[529,2274,2275,2287],{},[532,2276,2277,2280,2281,806,2284,616],{},[479,2278,2279],{},"Unit of Work \u002F tranzakció a contextben",", ugyanaz a minta, mint a ",[457,2282,2283],{"href":415},"pgx-stacknél",[457,2285,238],{"href":2286},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#unit-of-work--tranzakci%C3%B3-a-contextben",[532,2288,2289,1078,2292,585,2295,2298],{},[479,2290,2291],{},"Resolver-függvények",[452,2293,2294],{},"From(ctx, db)",[452,2296,2297],{},"Conn(ctx, db)","): ugyanaz a \"csatlakozz a contextbeli tranzakcióhoz, ha van\" logika, bun-specifikus visszatérési típussal.",[2300,2301,2302],"style",{},"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}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":493,"searchDepth":647,"depth":647,"links":2304},[2305,2306,2307,2308,2309,2310,2311,2312,2313],{"id":519,"depth":647,"text":520},{"id":571,"depth":647,"text":572},{"id":789,"depth":647,"text":790},{"id":845,"depth":647,"text":846},{"id":1381,"depth":647,"text":1382},{"id":1704,"depth":647,"text":1705},{"id":1766,"depth":647,"text":1767},{"id":1800,"depth":647,"text":1801},{"id":2271,"depth":647,"text":2272},"Az opcionális bun adapter: query builder és struct-modellek, a Transactor kontrakt változatlanul.","md",null,{},{"icon":47},{"title":418,"description":2314},"8xWzF3PiHkku1jDosVCUIxTtp37UDkndDK7xKKfLrog",[2322,2324],{"title":414,"path":415,"stem":416,"description":2323,"icon":106,"children":-1},"A pgx-natív adatbázis-stack: pool, a DBTX query executor és a contextet figyelő DB.",{"title":422,"path":423,"stem":424,"description":2325,"icon":425,"children":-1},"Kereszt-repository tranzakciók a contextben, plumbing nélkül.",1785445883760]