[{"data":1,"prerenderedAt":915},["ShallowReactive",2],{"navigation_docs_en":3,"-en-cli-add-db":342,"-en-cli-add-db-surround":910},[4,45,61,96,132,166,196,217,241,265],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F10.reference",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F10.reference\u002F1.configuration","i-lucide-settings",{"title":57,"path":58,"stem":59,"icon":60},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F10.reference\u002F2.dependencies","i-lucide-package",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[67,72,77,82,86,91],{"title":68,"path":69,"stem":70,"icon":71},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture","i-lucide-layers",{"title":73,"path":74,"stem":75,"icon":76},"Application lifecycle","\u002Fen\u002Fconcepts\u002Fapplication-lifecycle","en\u002F2.concepts\u002F2.application-lifecycle","i-lucide-power",{"title":78,"path":79,"stem":80,"icon":81},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F3.error-model","i-lucide-shield-alert",{"title":52,"path":83,"stem":84,"icon":85},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F4.configuration","i-lucide-settings-2",{"title":87,"path":88,"stem":89,"icon":90},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F5.codegen-pipeline","i-lucide-file-json",{"title":92,"path":93,"stem":94,"icon":95},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F6.design-patterns","i-lucide-puzzle",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":44},"HTTP & Routing","i-lucide-globe","\u002Fen\u002Fhttp","en\u002F3.http",[102,107,112,117,122,127],{"title":103,"path":104,"stem":105,"icon":106},"The server core","\u002Fen\u002Fhttp\u002Fserver","en\u002F3.http\u002F1.server","i-lucide-server",{"title":108,"path":109,"stem":110,"icon":111},"The Fiber engine","\u002Fen\u002Fhttp\u002Ffiber","en\u002F3.http\u002F2.fiber","i-lucide-zap",{"title":113,"path":114,"stem":115,"icon":116},"The chi engine","\u002Fen\u002Fhttp\u002Fchi","en\u002F3.http\u002F3.chi","i-lucide-route",{"title":118,"path":119,"stem":120,"icon":121},"Error responses","\u002Fen\u002Fhttp\u002Ferror-responses","en\u002F3.http\u002F4.error-responses","i-lucide-octagon-alert",{"title":123,"path":124,"stem":125,"icon":126},"Validation","\u002Fen\u002Fhttp\u002Fvalidation","en\u002F3.http\u002F5.validation","i-lucide-badge-check",{"title":128,"path":129,"stem":130,"icon":131},"Pagination","\u002Fen\u002Fhttp\u002Fpagination","en\u002F3.http\u002F6.pagination","i-lucide-list-ordered",{"title":133,"icon":134,"path":135,"stem":136,"children":137,"page":44},"Database","i-lucide-database","\u002Fen\u002Fdatabase","en\u002F4.database",[138,142,147,151,156,161],{"title":139,"path":140,"stem":141,"icon":134},"Overview","\u002Fen\u002Fdatabase\u002Foverview","en\u002F4.database\u002F1.overview",{"title":143,"path":144,"stem":145,"icon":146},"pgx","\u002Fen\u002Fdatabase\u002Fpgx","en\u002F4.database\u002F2.pgx","i-lucide-plug",{"title":148,"path":149,"stem":150,"icon":71},"bun","\u002Fen\u002Fdatabase\u002Fbun","en\u002F4.database\u002F3.bun",{"title":152,"path":153,"stem":154,"icon":155},"Transactions","\u002Fen\u002Fdatabase\u002Ftransactions","en\u002F4.database\u002F4.transactions","i-lucide-git-merge",{"title":157,"path":158,"stem":159,"icon":160},"Migrations","\u002Fen\u002Fdatabase\u002Fmigrations","en\u002F4.database\u002F5.migrations","i-lucide-file-stack",{"title":162,"path":163,"stem":164,"icon":165},"Seeders","\u002Fen\u002Fdatabase\u002Fseeding","en\u002F4.database\u002F6.seeding","i-lucide-sprout",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":44},"Async & Background","i-lucide-workflow","\u002Fen\u002Fasync","en\u002F5.async",[172,176,181,186,191],{"title":173,"path":174,"stem":175,"icon":131},"Queue","\u002Fen\u002Fasync\u002Fqueue","en\u002F5.async\u002F1.queue",{"title":177,"path":178,"stem":179,"icon":180},"Events","\u002Fen\u002Fasync\u002Fevents","en\u002F5.async\u002F2.events","i-lucide-radio",{"title":182,"path":183,"stem":184,"icon":185},"Outbox","\u002Fen\u002Fasync\u002Foutbox","en\u002F5.async\u002F3.outbox","i-lucide-inbox",{"title":187,"path":188,"stem":189,"icon":190},"Scheduling","\u002Fen\u002Fasync\u002Fscheduler","en\u002F5.async\u002F4.scheduler","i-lucide-calendar-clock",{"title":192,"path":193,"stem":194,"icon":195},"Worker","\u002Fen\u002Fasync\u002Fworker","en\u002F5.async\u002F5.worker","i-lucide-cog",{"title":197,"icon":198,"path":199,"stem":200,"children":201,"page":44},"Security","i-lucide-shield-check","\u002Fen\u002Fsecurity","en\u002F6.security",[202,207,212],{"title":203,"path":204,"stem":205,"icon":206},"Authentication","\u002Fen\u002Fsecurity\u002Fauthentication","en\u002F6.security\u002F1.authentication","i-lucide-key-round",{"title":208,"path":209,"stem":210,"icon":211},"RBAC","\u002Fen\u002Fsecurity\u002Frbac","en\u002F6.security\u002F2.rbac","i-lucide-users",{"title":213,"path":214,"stem":215,"icon":216},"Policies","\u002Fen\u002Fsecurity\u002Fpolicies","en\u002F6.security\u002F3.policies","i-lucide-gavel",{"title":218,"icon":219,"path":220,"stem":221,"children":222,"page":44},"Observability","i-lucide-activity","\u002Fen\u002Fobservability","en\u002F7.observability",[223,226,231,236],{"title":139,"path":224,"stem":225,"icon":219},"\u002Fen\u002Fobservability\u002Foverview","en\u002F7.observability\u002F1.overview",{"title":227,"path":228,"stem":229,"icon":230},"Logging","\u002Fen\u002Fobservability\u002Flogging","en\u002F7.observability\u002F2.logging","i-lucide-scroll-text",{"title":232,"path":233,"stem":234,"icon":235},"OpenTelemetry","\u002Fen\u002Fobservability\u002Fopentelemetry","en\u002F7.observability\u002F3.opentelemetry","i-lucide-radar",{"title":237,"path":238,"stem":239,"icon":240},"Sentry","\u002Fen\u002Fobservability\u002Fsentry","en\u002F7.observability\u002F4.sentry","i-lucide-bug",{"title":242,"icon":243,"path":244,"stem":245,"children":246,"page":44},"Storage & Mail","i-lucide-hard-drive","\u002Fen\u002Fstorage-mail","en\u002F8.storage-mail",[247,251,256,261],{"title":248,"path":249,"stem":250,"icon":243},"Storage","\u002Fen\u002Fstorage-mail\u002Fstorage","en\u002F8.storage-mail\u002F1.storage",{"title":252,"path":253,"stem":254,"icon":255},"Email","\u002Fen\u002Fstorage-mail\u002Fmail","en\u002F8.storage-mail\u002F2.mail","i-lucide-mail",{"title":257,"path":258,"stem":259,"icon":260},"Notifications","\u002Fen\u002Fstorage-mail\u002Fnotifications","en\u002F8.storage-mail\u002F3.notifications","i-lucide-bell",{"title":262,"path":263,"stem":264,"icon":180},"Realtime","\u002Fen\u002Fstorage-mail\u002Frealtime","en\u002F8.storage-mail\u002F4.realtime",{"title":266,"icon":267,"path":268,"stem":269,"children":270,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F9.cli",[271,274,279,284,289,294,299,303,308,313,318,323,328,333,337],{"title":139,"path":272,"stem":273,"icon":267},"\u002Fen\u002Fcli\u002Foverview","en\u002F9.cli\u002F1.overview",{"title":275,"path":276,"stem":277,"icon":278},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F9.cli\u002F10.add-db","i-lucide-database-zap",{"title":280,"path":281,"stem":282,"icon":283},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F9.cli\u002F11.add-compose","i-lucide-container",{"title":285,"path":286,"stem":287,"icon":288},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F9.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":290,"path":291,"stem":292,"icon":293},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F9.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":295,"path":296,"stem":297,"icon":298},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F9.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":300,"path":301,"stem":302,"icon":165},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F9.cli\u002F15.add-seeder",{"title":304,"path":305,"stem":306,"icon":307},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F9.cli\u002F2.new-project","i-lucide-folder-plus",{"title":309,"path":310,"stem":311,"icon":312},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F9.cli\u002F3.new-module","i-lucide-blocks",{"title":314,"path":315,"stem":316,"icon":317},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F9.cli\u002F4.add-surface","i-lucide-layers-2",{"title":319,"path":320,"stem":321,"icon":322},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F9.cli\u002F5.add-core","i-lucide-box",{"title":324,"path":325,"stem":326,"icon":327},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F9.cli\u002F6.add-handler","i-lucide-webhook",{"title":329,"path":330,"stem":331,"icon":332},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F9.cli\u002F7.new-migration","i-lucide-file-plus",{"title":334,"path":335,"stem":336,"icon":195},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F9.cli\u002F8.worker-generators",{"title":338,"path":339,"stem":340,"icon":341},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F9.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"id":343,"title":275,"body":344,"description":903,"extension":904,"links":905,"meta":906,"navigation":907,"path":276,"seo":908,"stem":277,"__hash__":909},"docs_en\u002Fen\u002F9.cli\u002F10.add-db.md",{"type":345,"value":346,"toc":898},"minimark",[347,413,456,485,524,547,552,578,649,737,760,790,799,803,829,863,874,878,894],[348,349,354],"pre",{"className":350,"code":351,"language":352,"meta":353,"style":353},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go tool gpsystem add db \u003Cmodule> \u003Cname> [--connector pgx|bun]\n","sh","",[355,356,357],"code",{"__ignoreMap":353},[358,359,362,366,370,373,376,379,383,386,390,393,395,398,400,402,405,407,410],"span",{"class":360,"line":361},"line",1,[358,363,365],{"class":364},"sBMFI","go",[358,367,369],{"class":368},"sfazB"," tool",[358,371,372],{"class":368}," gpsystem",[358,374,375],{"class":368}," add",[358,377,378],{"class":368}," db",[358,380,382],{"class":381},"sMK4o"," \u003C",[358,384,385],{"class":368},"modul",[358,387,389],{"class":388},"sTEyZ","e",[358,391,392],{"class":381},">",[358,394,382],{"class":381},[358,396,397],{"class":368},"nam",[358,399,389],{"class":388},[358,401,392],{"class":381},[358,403,404],{"class":388}," [--connector ",[358,406,143],{"class":368},[358,408,409],{"class":381},"|",[358,411,412],{"class":364},"bun]\n",[414,415,416,417,420,421,424,425,431,432,434,435,438,439,444,445,420,448,451,452,455],"p",{},"Every module already has one default connection (",[355,418,419],{},"cfg.DB"," \u002F ",[355,422,423],{},"pool","), chosen for the whole project at ",[426,427,428],"a",{"href":305},[355,429,430],{},"new project --db",". ",[355,433,275],{}," adds another, independent one to a single module: its own ",[355,436,437],{},"DB_\u003CNAME>_*"," config, its own pgx pool (optionally wrapped with ",[426,440,441],{"href":149},[355,442,443],{},"dbx\u002Fbunx","), its own closer, and ",[355,446,447],{},"\u003CName>DB",[355,449,450],{},"\u003CName>Transactor"," fields on the module's ",[355,453,454],{},"Dependencies",".",[348,457,459],{"className":350,"code":458,"language":352,"meta":353,"style":353},"go tool gpsystem add db news analytics --connector bun\n",[355,460,461],{"__ignoreMap":353},[358,462,463,465,467,469,471,473,476,479,482],{"class":360,"line":361},[358,464,365],{"class":364},[358,466,369],{"class":368},[358,468,372],{"class":368},[358,470,375],{"class":368},[358,472,378],{"class":368},[358,474,475],{"class":368}," news",[358,477,478],{"class":368}," analytics",[358,480,481],{"class":368}," --connector",[358,483,484],{"class":368}," bun\n",[486,487,488,501],"table",{},[489,490,491],"thead",{},[492,493,494,498],"tr",{},[495,496,497],"th",{},"Flag",[495,499,500],{},"Meaning",[502,503,504],"tbody",{},[492,505,506,512],{},[507,508,509],"td",{},[355,510,511],{},"--connector",[507,513,514,516,517,519,520,523],{},[355,515,143],{}," or ",[355,518,148],{}," for this connection (default: the project's own ",[355,521,522],{},"--db"," choice)",[414,525,526,527,531,532,535,536,539,540,543,544,546],{},"The connector is a property of the ",[528,529,530],"strong",{},"connection",", not the project: a module can have a pgx-native default connection and a bun-backed ",[355,533,534],{},"analytics"," connection side by side, or vice versa. This is a hard boundary, not a style choice; see ",[426,537,152],{"href":538},"\u002Fen\u002Fdatabase\u002Ftransactions#one-transactor-per-connection",": a pgx-native ",[355,541,542],{},"dbx\u002Fpg"," executor and a ",[355,545,443],{}," one cannot share a single transaction, so a connection's connector cannot change per call.",[548,549,551],"h2",{"id":550},"what-it-generates","What it generates",[348,553,557],{"className":554,"code":555,"filename":556,"language":365,"meta":353,"style":353},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","DBAnalytics dbx.Config `envPrefix:\"DB_ANALYTICS_\"`\n","internal\u002Fplatform\u002Fconfig\u002Fconfig.go",[355,558,559],{"__ignoreMap":353},[358,560,561,564,566,569,572,575],{"class":360,"line":361},[358,562,563],{"class":388},"DBAnalytics dbx",[358,565,455],{"class":381},[358,567,568],{"class":388},"Config ",[358,570,571],{"class":381},"`",[358,573,574],{"class":368},"envPrefix:\"DB_ANALYTICS_\"",[358,576,577],{"class":381},"`\n",[348,579,582],{"className":554,"code":580,"filename":581,"language":365,"meta":353,"style":353},"analyticsPool := pg.MustNewPool(ctx, cfg.DBAnalytics)\nanalyticsBun := bunx.Open(analyticsPool)   \u002F\u002F only for --connector bun\n","cmd\u002Fnews\u002Fmain.go",[355,583,584,621],{"__ignoreMap":353},[358,585,586,589,592,595,597,601,604,607,610,613,615,618],{"class":360,"line":361},[358,587,588],{"class":388},"analyticsPool ",[358,590,591],{"class":381},":=",[358,593,594],{"class":388}," pg",[358,596,455],{"class":381},[358,598,600],{"class":599},"s2Zo4","MustNewPool",[358,602,603],{"class":381},"(",[358,605,606],{"class":388},"ctx",[358,608,609],{"class":381},",",[358,611,612],{"class":388}," cfg",[358,614,455],{"class":381},[358,616,617],{"class":388},"DBAnalytics",[358,619,620],{"class":381},")\n",[358,622,624,627,629,632,634,637,639,642,645],{"class":360,"line":623},2,[358,625,626],{"class":388},"analyticsBun ",[358,628,591],{"class":381},[358,630,631],{"class":388}," bunx",[358,633,455],{"class":381},[358,635,636],{"class":599},"Open",[358,638,603],{"class":381},[358,640,641],{"class":388},"analyticsPool",[358,643,644],{"class":381},")",[358,646,648],{"class":647},"sHwdD","   \u002F\u002F only for --connector bun\n",[348,650,653],{"className":554,"code":651,"filename":652,"language":365,"meta":353,"style":353},"type Dependencies struct {\n    DB                  *pg.DB\n    Transactor          dbx.Transactor\n    AnalyticsDB         *bun.DB\n    AnalyticsTransactor dbx.Transactor\n    \u002F\u002F gpsystem:dependencies\n}\n","internal\u002Fmodules\u002Fnews\u002Fregister.go",[355,654,655,669,685,699,713,725,731],{"__ignoreMap":353},[358,656,657,660,663,666],{"class":360,"line":361},[358,658,659],{"class":381},"type",[358,661,662],{"class":364}," Dependencies",[358,664,665],{"class":381}," struct",[358,667,668],{"class":381}," {\n",[358,670,671,674,677,680,682],{"class":360,"line":623},[358,672,673],{"class":388},"    DB                  ",[358,675,676],{"class":381},"*",[358,678,679],{"class":364},"pg",[358,681,455],{"class":381},[358,683,684],{"class":364},"DB\n",[358,686,688,691,694,696],{"class":360,"line":687},3,[358,689,690],{"class":388},"    Transactor          ",[358,692,693],{"class":364},"dbx",[358,695,455],{"class":381},[358,697,698],{"class":364},"Transactor\n",[358,700,702,705,707,709,711],{"class":360,"line":701},4,[358,703,704],{"class":388},"    AnalyticsDB         ",[358,706,676],{"class":381},[358,708,148],{"class":364},[358,710,455],{"class":381},[358,712,684],{"class":364},[358,714,716,719,721,723],{"class":360,"line":715},5,[358,717,718],{"class":388},"    AnalyticsTransactor ",[358,720,693],{"class":364},[358,722,455],{"class":381},[358,724,698],{"class":364},[358,726,728],{"class":360,"line":727},6,[358,729,730],{"class":647},"    \u002F\u002F gpsystem:dependencies\n",[358,732,734],{"class":360,"line":733},7,[358,735,736],{"class":381},"}\n",[414,738,739,740,743,744,747,748,752,753,756,757,759],{},"A closer is registered next to the pool's (",[355,741,742],{},"analytics-pgxpool",", and ",[355,745,746],{},"analytics-bun"," when the connector is bun, since the bun closer is registered after the pool's, so ",[426,749,751],{"href":750},"\u002Fen\u002Fconcepts\u002Farchitecture#graceful-shutdown","graceful shutdown","'s LIFO order closes the bun handle before its underlying pool). When ",[355,754,755],{},"cmd\u002Fworker\u002Fmain.go"," already exists, the same pool\u002Fdeps\u002Fcloser wiring is added there too, so listeners and jobs see the connection through the same ",[355,758,454],{}," struct.",[414,761,762,765,766,769,770,773,774,777,778,781,782,785,786,455],{},[355,763,764],{},".env.example"," gets a ",[355,767,768],{},"DB_ANALYTICS_*"," block pointing at the same local Postgres as the default connection. Repoint it to a different instance for local development. ",[355,771,772],{},"DB_ANALYTICS_USER",", ",[355,775,776],{},"DB_ANALYTICS_PASSWORD"," and ",[355,779,780],{},"DB_ANALYTICS_NAME"," are ",[528,783,784],{},"required",": the process fails at startup, not on the first query, if they are unset; see the ",[426,787,789],{"href":788},"\u002Fen\u002Freference\u002Fconfiguration#named-connections","configuration reference",[791,792,793,798],"warning",{},[426,794,795],{"href":158},[355,796,797],{},"cmd\u002Fmigrate"," only ever targets the project's default connection. A named connection's schema is not managed by the generated migration runner.",[548,800,802],{"id":801},"binding-the-module-repository-to-it","Binding the module repository to it",[414,804,805,806,808,809,811,812,815,816,822,823,828],{},"By itself, ",[355,807,275],{}," only makes the connection available on ",[355,810,454],{},"; it does not touch the module's repository. Bind the module's shared ",[355,813,814],{},"repository\u002F"," skeleton to it with ",[426,817,819],{"href":818},"\u002Fen\u002Fcli\u002Fadd-surface#binding-the-repository-to-a-named-connection",[355,820,821],{},"add surface --db"," (or, when retrofitting, ",[426,824,825],{"href":320},[355,826,827],{},"add core --db","):",[348,830,832],{"className":350,"code":831,"language":352,"meta":353,"style":353},"go tool gpsystem add surface news reports --db analytics\n# -> internal\u002Fmodules\u002Fnews\u002Frepository\u002Fanalytics\u002Fdoc.go\n",[355,833,834,858],{"__ignoreMap":353},[358,835,836,838,840,842,844,847,849,852,855],{"class":360,"line":361},[358,837,365],{"class":364},[358,839,369],{"class":368},[358,841,372],{"class":368},[358,843,375],{"class":368},[358,845,846],{"class":368}," surface",[358,848,475],{"class":368},[358,850,851],{"class":368}," reports",[358,853,854],{"class":368}," --db",[358,856,857],{"class":368}," analytics\n",[358,859,860],{"class":360,"line":623},[358,861,862],{"class":647},"# -> internal\u002Fmodules\u002Fnews\u002Frepository\u002Fanalytics\u002Fdoc.go\n",[414,864,865,866,868,869,871,872,455],{},"Without ",[355,867,522],{}," the module keeps the flat ",[355,870,814],{}," directory bound to the default connection; nothing changes for projects that never call ",[355,873,275],{},[548,875,877],{"id":876},"older-projects","Older projects",[414,879,880,882,883,886,887,777,890,893],{},[355,881,275],{}," preflights ",[355,884,885],{},"cmd\u002F\u003Cmodule>\u002Fmain.go"," for the ",[355,888,889],{},"gpsystem:pools",[355,891,892],{},"gpsystem:closers"," anchors before writing anything. Projects generated before this feature lack them; the command fails with the exact two comment lines to add by hand (see a freshly generated project for placement); run it again once they're in place.",[895,896,897],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .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}",{"title":353,"searchDepth":623,"depth":623,"links":899},[900,901,902],{"id":550,"depth":623,"text":551},{"id":801,"depth":623,"text":802},{"id":876,"depth":623,"text":877},"Add a named database connection to a module, with its own pool and connector.","md",null,{},{"icon":278},{"title":275,"description":903},"JCvU0mPAG58_2KpW9ylrz485aitLTDUlZV9Va81PrFs",[911,913],{"title":139,"path":272,"stem":273,"description":912,"icon":267,"children":-1},"How the gpsystem CLI works: tool directive, safety rules, anchors, manifest.",{"title":280,"path":281,"stem":282,"description":914,"icon":283,"children":-1},"Regenerate compose.yml, or just the Dockerfile\u002F.dockerignore, standalone into an existing project.",1784668711045]