[{"data":1,"prerenderedAt":1650},["ShallowReactive",2],{"navigation":3,"\u002Frecipes\u002Fdeploy\u002Fnetlify":208,"\u002Frecipes\u002Fdeploy\u002Fnetlify-surround":1645},[4,98,175],{"title":5,"path":6,"stem":7,"children":8,"icon":97},"Guide","\u002Fguide","1.guide\u002F1.index",[9,12,17,22,46,61,79],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fguide\u002Finstallation","1.guide\u002F2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Quick start","\u002Fguide\u002Fquick-start","1.guide\u002F3.quick-start","i-lucide-rocket",{"title":23,"path":24,"stem":25,"children":26,"icon":45},"Server","\u002Fguide\u002Fserver","1.guide\u002F4.server\u002F1.index",[27,30,35,40],{"title":28,"path":24,"stem":25,"icon":29},"Usage","i-lucide-server",{"title":31,"path":32,"stem":33,"icon":34},"Config file","\u002Fguide\u002Fserver\u002Fconfig-file","1.guide\u002F4.server\u002F2.config-file","i-lucide-file-cog",{"title":36,"path":37,"stem":38,"icon":39},"Options","\u002Fguide\u002Fserver\u002Foptions","1.guide\u002F4.server\u002F3.options","i-lucide-settings",{"title":41,"path":42,"stem":43,"icon":44},"Advanced","\u002Fguide\u002Fserver\u002Fadvanced","1.guide\u002F4.server\u002F4.advanced","i-lucide-flask-conical",false,{"title":47,"path":48,"stem":49,"children":50,"icon":45},"Client","\u002Fguide\u002Fclient","1.guide\u002F5.client\u002F1.index",[51,53,58],{"title":28,"path":48,"stem":49,"icon":52},"i-lucide-monitor-smartphone",{"title":54,"path":55,"stem":56,"icon":57},"Live queries","\u002Fguide\u002Fclient\u002Flive-queries","1.guide\u002F5.client\u002F2.live-queries","i-lucide-radio",{"title":41,"path":59,"stem":60,"icon":44},"\u002Fguide\u002Fclient\u002Fadvanced","1.guide\u002F5.client\u002F3.advanced",{"title":62,"path":63,"stem":64,"children":65,"icon":45},"Development socket","\u002Fguide\u002Fsocket","1.guide\u002F6.socket\u002F1.index",[66,68,71,74],{"title":28,"path":63,"stem":64,"icon":67},"i-lucide-plug",{"title":36,"path":69,"stem":70,"icon":39},"\u002Fguide\u002Fsocket\u002Foptions","1.guide\u002F6.socket\u002F2.options",{"title":41,"path":72,"stem":73,"icon":44},"\u002Fguide\u002Fsocket\u002Fadvanced","1.guide\u002F6.socket\u002F3.advanced",{"title":75,"path":76,"stem":77,"icon":78},"PGlite in dev, Postgres in prod","\u002Fguide\u002Fsocket\u002Fdevelopment-only","1.guide\u002F6.socket\u002F4.development-only","i-lucide-cloud-upload",{"title":80,"path":81,"stem":82,"children":83,"icon":45},"DevTools & tooling","\u002Fguide\u002Fdevtools","1.guide\u002F7.devtools\u002F1.index",[84,87,92],{"title":85,"path":81,"stem":82,"icon":86},"DevTools tab","i-lucide-wrench",{"title":88,"path":89,"stem":90,"icon":91},"Actions","\u002Fguide\u002Fdevtools\u002Factions","1.guide\u002F7.devtools\u002F2.actions","i-lucide-zap",{"title":93,"path":94,"stem":95,"icon":96},"Terminal","\u002Fguide\u002Fdevtools\u002Fterminal","1.guide\u002F7.devtools\u002F3.terminal","i-lucide-square-terminal","i-lucide-book-open",{"title":99,"icon":100,"path":101,"stem":102,"children":103,"page":45},"Recipes","i-lucide-chef-hat","\u002Frecipes","2.recipes",[104,116,138,159,171],{"title":105,"path":106,"stem":107,"children":108,"icon":45},"Migrations","\u002Frecipes\u002Fmigrations","2.recipes\u002F1.migrations\u002F1.index",[109,111],{"title":28,"path":106,"stem":107,"icon":110},"i-lucide-database-backup",{"title":112,"path":113,"stem":114,"icon":115},"Edited migrations","\u002Frecipes\u002Fmigrations\u002Fedited-migrations","2.recipes\u002F1.migrations\u002F2.edited-migrations","i-lucide-file-diff",{"title":117,"path":118,"stem":119,"children":120,"icon":45},"Testing","\u002Frecipes\u002Ftesting","2.recipes\u002F2.testing\u002F1.index",[121,123,128,133],{"title":28,"path":118,"stem":119,"icon":122},"i-lucide-test-tube",{"title":124,"path":125,"stem":126,"icon":127},"Isolation","\u002Frecipes\u002Ftesting\u002Fisolation","2.recipes\u002F2.testing\u002F2.isolation","i-lucide-git-fork",{"title":129,"path":130,"stem":131,"icon":132},"vitest","\u002Frecipes\u002Ftesting\u002Fvitest","2.recipes\u002F2.testing\u002F3.vitest","i-simple-icons-vitest",{"title":134,"path":135,"stem":136,"icon":137},"@nuxt\u002Ftest-utils","\u002Frecipes\u002Ftesting\u002Fnuxt-test-utils","2.recipes\u002F2.testing\u002F4.nuxt-test-utils","i-simple-icons-nuxt",{"title":139,"path":140,"stem":141,"children":142,"icon":45},"Deploy","\u002Frecipes\u002Fdeploy","2.recipes\u002F3.deploy\u002F1.index",[143,144,149,154],{"title":139,"path":140,"stem":141},{"title":145,"path":146,"stem":147,"icon":148},"Any Postgres","\u002Frecipes\u002Fdeploy\u002Fpostgres","2.recipes\u002F3.deploy\u002F2.postgres","i-lucide-database",{"title":150,"path":151,"stem":152,"icon":153},"Netlify","\u002Frecipes\u002Fdeploy\u002Fnetlify","2.recipes\u002F3.deploy\u002F3.netlify","i-simple-icons-netlify",{"title":155,"path":156,"stem":157,"icon":158},"Neon","\u002Frecipes\u002Fdeploy\u002Fneon","2.recipes\u002F3.deploy\u002F4.neon","i-simple-icons-neon",{"title":160,"path":161,"stem":162,"children":163,"icon":45},"Outside Nuxt","\u002Frecipes\u002Foutside-nuxt","2.recipes\u002F4.outside-nuxt\u002F1.index",[164,167],{"title":165,"path":161,"stem":162,"icon":166},"Config and provider","i-lucide-package",{"title":168,"path":169,"stem":170,"icon":67},"Socket server","\u002Frecipes\u002Foutside-nuxt\u002Fsocket","2.recipes\u002F4.outside-nuxt\u002F2.socket",{"title":172,"path":173,"stem":174,"icon":67},"Nitro's useDatabase","\u002Frecipes\u002Fnitro-database","2.recipes\u002F5.nitro-database",{"title":176,"icon":177,"path":178,"stem":179,"children":180,"page":45},"Reference","i-lucide-code-xml","\u002Freference","3.reference",[181,185,189,193,198,203],{"title":182,"path":183,"stem":184,"icon":34},"Config files","\u002Freference\u002Fconfig-files","3.reference\u002F1.config-files",{"title":186,"path":187,"stem":188,"icon":39},"Module options","\u002Freference\u002Fmodule-options","3.reference\u002F2.module-options",{"title":190,"path":191,"stem":192,"icon":67},"Socket options","\u002Freference\u002Fsocket-options","3.reference\u002F3.socket-options",{"title":194,"path":195,"stem":196,"icon":197},"Exports","\u002Freference\u002Fexports","3.reference\u002F4.exports","i-lucide-boxes",{"title":199,"path":200,"stem":201,"icon":202},"Hooks","\u002Freference\u002Fhooks","3.reference\u002F5.hooks","i-lucide-anchor",{"title":204,"path":205,"stem":206,"icon":207},"Environment","\u002Freference\u002Fenvironment","3.reference\u002F6.environment","i-lucide-variable",{"id":209,"title":150,"body":210,"description":1638,"extension":1639,"links":1640,"meta":1641,"navigation":1642,"path":151,"seo":1643,"stem":152,"__hash__":1644},"docs\u002F2.recipes\u002F3.deploy\u002F3.netlify.md",{"type":211,"value":212,"toc":1632},"minimark",[213,235,421,426,440,539,546,550,563,566,570,644,648,1602,1613,1628],[214,215,216,217,221,222,225,226,229,230,234],"p",{},"Netlify Database is a platform that applies the migrations itself, and sets its own variable rather than ",[218,219,220],"code",{},"DATABASE_URL",". This documentation site runs on it, so it is the worked example: the ",[223,224,75],"a",{"href":76}," setup, with the socket's ",[218,227,228],{},"netlify"," ",[223,231,233],{"href":232},"\u002Fguide\u002Fsocket#provider-presets","preset"," standing in for Netlify Database in development, plus an in-browser instance for the examples:",[236,237,243],"pre",{"className":238,"code":239,"filename":240,"language":241,"meta":242,"style":242},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['nuxt-pglite'],\n  pglite: {\n    client: { enabled: true }, \u002F\u002F the interactive examples\n    server: {\n      enabled: false, \u002F\u002F nothing of PGlite on the server\n    },\n    socket: { port: 5456, provider: 'netlify' }, \u002F\u002F `NETLIFY_DB_URL` while `nuxt dev` runs\n  },\n})\n","docs\u002Fnuxt.config.ts","ts","",[218,244,245,269,297,308,335,345,362,368,406,412],{"__ignoreMap":242},[246,247,250,254,257,261,265],"span",{"class":248,"line":249},"line",1,[246,251,253],{"class":252},"s7zQu","export",[246,255,256],{"class":252}," default",[246,258,260],{"class":259},"s2Zo4"," defineNuxtConfig",[246,262,264],{"class":263},"sTEyZ","(",[246,266,268],{"class":267},"sMK4o","{\n",[246,270,272,276,279,282,285,289,291,294],{"class":248,"line":271},2,[246,273,275],{"class":274},"swJcz","  modules",[246,277,278],{"class":267},":",[246,280,281],{"class":263}," [",[246,283,284],{"class":267},"'",[246,286,288],{"class":287},"sfazB","nuxt-pglite",[246,290,284],{"class":267},[246,292,293],{"class":263},"]",[246,295,296],{"class":267},",\n",[246,298,300,303,305],{"class":248,"line":299},3,[246,301,302],{"class":274},"  pglite",[246,304,278],{"class":267},[246,306,307],{"class":267}," {\n",[246,309,311,314,316,319,322,324,328,331],{"class":248,"line":310},4,[246,312,313],{"class":274},"    client",[246,315,278],{"class":267},[246,317,318],{"class":267}," {",[246,320,321],{"class":274}," enabled",[246,323,278],{"class":267},[246,325,327],{"class":326},"sfNiH"," true",[246,329,330],{"class":267}," },",[246,332,334],{"class":333},"sHwdD"," \u002F\u002F the interactive examples\n",[246,336,338,341,343],{"class":248,"line":337},5,[246,339,340],{"class":274},"    server",[246,342,278],{"class":267},[246,344,307],{"class":267},[246,346,348,351,353,356,359],{"class":248,"line":347},6,[246,349,350],{"class":274},"      enabled",[246,352,278],{"class":267},[246,354,355],{"class":326}," false",[246,357,358],{"class":267},",",[246,360,361],{"class":333}," \u002F\u002F nothing of PGlite on the server\n",[246,363,365],{"class":248,"line":364},7,[246,366,367],{"class":267},"    },\n",[246,369,371,374,376,378,381,383,387,389,392,394,397,399,401,403],{"class":248,"line":370},8,[246,372,373],{"class":274},"    socket",[246,375,278],{"class":267},[246,377,318],{"class":267},[246,379,380],{"class":274}," port",[246,382,278],{"class":267},[246,384,386],{"class":385},"sbssI"," 5456",[246,388,358],{"class":267},[246,390,391],{"class":274}," provider",[246,393,278],{"class":267},[246,395,396],{"class":267}," '",[246,398,228],{"class":287},[246,400,284],{"class":267},[246,402,330],{"class":267},[246,404,405],{"class":333}," \u002F\u002F `NETLIFY_DB_URL` while `nuxt dev` runs\n",[246,407,409],{"class":248,"line":408},9,[246,410,411],{"class":267},"  },\n",[246,413,415,418],{"class":248,"line":414},10,[246,416,417],{"class":267},"}",[246,419,420],{"class":263},")\n",[422,423,425],"h2",{"id":424},"how-it-fits-together","How it fits together",[214,427,428,429,432,433,435,436,439],{},"Netlify Database is a Postgres that Netlify provisions for the site. It sets ",[218,430,431],{},"NETLIFY_DB_URL"," in builds and functions (never ",[218,434,220],{},"), and applies the SQL files in ",[218,437,438],{},"netlify\u002Fdatabase\u002Fmigrations"," itself, right before it publishes a deploy. Each deploy preview gets its own database branch, with the migrations of that deploy applied to it.",[441,442,443,460],"table",{},[444,445,446],"thead",{},[447,448,449,452,457],"tr",{},[450,451],"th",{},[450,453,454],{},[218,455,456],{},"nuxt dev",[450,458,459],{},"Deployed on Netlify",[461,462,463,480,500,521],"tbody",{},[447,464,465,470,477],{},[466,467,468],"td",{},[218,469,431],{},[466,471,472,473,229,475],{},"the socket's URL, from the ",[218,474,228],{},[223,476,233],{"href":232},[466,478,479],{},"the site's database (or the preview's branch)",[447,481,482,487,497],{},[466,483,484],{},[218,485,486],{},"NETLIFY_DB_DRIVER",[466,488,489,492,493,496],{},[218,490,491],{},"server",": ",[218,494,495],{},"pg"," over the wire protocol",[466,498,499],{},"Netlify's default: Neon's serverless driver",[447,501,502,506,518],{},[466,503,504],{},[218,505,438],{},[466,507,508,509,512,513],{},"applied by ",[218,510,511],{},"init"," with ",[223,514,515],{"href":106},[218,516,517],{},"applyMigrations",[466,519,520],{},"applied by Netlify before publishing",[447,522,523,526,535],{},[466,524,525],{},"Applied migrations recorded in",[466,527,528,531,532,534],{},[218,529,530],{},"netlify.migrations",", ",[218,533,517],{},"'s default",[466,536,537],{},[218,538,530],{},[214,540,541,542,545],{},"The routes only know ",[218,543,544],{},"drizzle-orm\u002Fnetlify-db",". Nothing else changes between development and production.",[422,547,549],{"id":548},"try-it","Try it",[214,551,552,553,556,557,559,560,562],{},"The demo below calls ",[218,554,555],{},"\u002Fapi\u002Fvisits",", a route that uses Drizzle over ",[218,558,431],{},". In ",[218,561,456],{}," the socket exports that variable and the route reaches PGlite; on the deployed site Netlify sets it, and the route tells you when the database is not enabled.",[564,565],"pglite-server-demo",{},[422,567,569],{"id":568},"what-ends-up-in-the-build","What ends up in the build",[441,571,572,584],{},[444,573,574],{},[447,575,576,578,581],{},[450,577],{},[450,579,580],{},"Server output",[450,582,583],{},"Client output",[461,585,586,601,616,628],{},[447,587,588,591,598],{},[466,589,590],{},"PGlite engine and WebAssembly",[466,592,593,594,597],{},"absent (",[218,595,596],{},"server.enabled: false",")",[466,599,600],{},"present, loaded in a worker on first use",[447,602,603,608,613],{},[466,604,605],{},[218,606,607],{},"server\u002Fpglite.config.ts",[466,609,610,611],{},"absent: only the socket reads it, in ",[218,612,456],{},[466,614,615],{},"absent",[447,617,618,623,625],{},[466,619,620],{},[218,621,622],{},"app\u002Fpglite.config.ts",[466,624,615],{},[466,626,627],{},"present",[447,629,630,640,642],{},[466,631,632,633,531,635,531,637,597],{},"Your driver (",[218,634,544],{},[218,636,495],{},[218,638,639],{},"@neondatabase\u002Fserverless",[466,641,627],{},[466,643,615],{},[422,645,647],{"id":646},"steps","Steps",[646,649,651,656,817,890,897,1034,1059,1066,1083,1087,1093,1243,1249,1280,1491,1498,1504,1550,1573,1577,1592,1595],{"level":650},"3",[652,653,655],"h3",{"id":654},"write-the-schema-and-generate-migrations","Write the schema and generate migrations",[236,657,660],{"className":238,"code":658,"filename":659,"language":241,"meta":242,"style":242},"import { pgTable, serial, timestamp } from 'drizzle-orm\u002Fpg-core'\n\nexport const visits = pgTable('visits', {\n  id: serial('id').primaryKey(),\n  createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n})\n","server\u002Fdatabase\u002Fschema.ts",[218,661,662,696,702,731,762,811],{"__ignoreMap":242},[246,663,664,667,669,672,674,677,679,682,685,688,690,693],{"class":248,"line":249},[246,665,666],{"class":252},"import",[246,668,318],{"class":267},[246,670,671],{"class":263}," pgTable",[246,673,358],{"class":267},[246,675,676],{"class":263}," serial",[246,678,358],{"class":267},[246,680,681],{"class":263}," timestamp",[246,683,684],{"class":267}," }",[246,686,687],{"class":252}," from",[246,689,396],{"class":267},[246,691,692],{"class":287},"drizzle-orm\u002Fpg-core",[246,694,695],{"class":267},"'\n",[246,697,698],{"class":248,"line":271},[246,699,701],{"emptyLinePlaceholder":700},true,"\n",[246,703,704,706,710,713,716,718,720,722,725,727,729],{"class":248,"line":299},[246,705,253],{"class":252},[246,707,709],{"class":708},"spNyl"," const",[246,711,712],{"class":263}," visits ",[246,714,715],{"class":267},"=",[246,717,671],{"class":259},[246,719,264],{"class":263},[246,721,284],{"class":267},[246,723,724],{"class":287},"visits",[246,726,284],{"class":267},[246,728,358],{"class":267},[246,730,307],{"class":267},[246,732,733,736,738,740,742,744,747,749,751,754,757,760],{"class":248,"line":310},[246,734,735],{"class":274},"  id",[246,737,278],{"class":267},[246,739,676],{"class":259},[246,741,264],{"class":263},[246,743,284],{"class":267},[246,745,746],{"class":287},"id",[246,748,284],{"class":267},[246,750,597],{"class":263},[246,752,753],{"class":267},".",[246,755,756],{"class":259},"primaryKey",[246,758,759],{"class":263},"()",[246,761,296],{"class":267},[246,763,764,767,769,771,773,775,778,780,782,784,787,789,791,793,795,797,800,802,804,807,809],{"class":248,"line":337},[246,765,766],{"class":274},"  createdAt",[246,768,278],{"class":267},[246,770,681],{"class":259},[246,772,264],{"class":263},[246,774,284],{"class":267},[246,776,777],{"class":287},"created_at",[246,779,284],{"class":267},[246,781,358],{"class":267},[246,783,318],{"class":267},[246,785,786],{"class":274}," withTimezone",[246,788,278],{"class":267},[246,790,327],{"class":326},[246,792,684],{"class":267},[246,794,597],{"class":263},[246,796,753],{"class":267},[246,798,799],{"class":259},"notNull",[246,801,759],{"class":263},[246,803,753],{"class":267},[246,805,806],{"class":259},"defaultNow",[246,808,759],{"class":263},[246,810,296],{"class":267},[246,812,813,815],{"class":248,"line":347},[246,814,417],{"class":267},[246,816,420],{"class":263},[236,818,821],{"className":238,"code":819,"filename":820,"language":241,"meta":242,"style":242},"import { defineRelations } from 'drizzle-orm'\n\nimport * as schema from '.\u002Fschema'\n\nexport const relations = defineRelations(schema)\n","server\u002Fdatabase\u002Frelations.ts",[218,822,823,843,847,870,874],{"__ignoreMap":242},[246,824,825,827,829,832,834,836,838,841],{"class":248,"line":249},[246,826,666],{"class":252},[246,828,318],{"class":267},[246,830,831],{"class":263}," defineRelations",[246,833,684],{"class":267},[246,835,687],{"class":252},[246,837,396],{"class":267},[246,839,840],{"class":287},"drizzle-orm",[246,842,695],{"class":267},[246,844,845],{"class":248,"line":271},[246,846,701],{"emptyLinePlaceholder":700},[246,848,849,851,854,857,860,863,865,868],{"class":248,"line":299},[246,850,666],{"class":252},[246,852,853],{"class":267}," *",[246,855,856],{"class":252}," as",[246,858,859],{"class":263}," schema ",[246,861,862],{"class":252},"from",[246,864,396],{"class":267},[246,866,867],{"class":287},".\u002Fschema",[246,869,695],{"class":267},[246,871,872],{"class":248,"line":310},[246,873,701],{"emptyLinePlaceholder":700},[246,875,876,878,880,883,885,887],{"class":248,"line":337},[246,877,253],{"class":252},[246,879,709],{"class":708},[246,881,882],{"class":263}," relations ",[246,884,715],{"class":267},[246,886,831],{"class":259},[246,888,889],{"class":263},"(schema)\n",[214,891,892,893,896],{},"drizzle-kit ",[218,894,895],{},"1.0.0-rc.4"," or later writes its migrations where Netlify looks for them:",[236,898,901],{"className":238,"code":899,"filename":900,"language":241,"meta":242,"style":242},"import { defineConfig } from 'drizzle-kit'\n\n\u002F\u002F Netlify applies `out` on deploy and `init` applies it locally: no `push`\u002F`migrate`.\nexport default defineConfig({\n  out: '.\u002Fnetlify\u002Fdatabase\u002Fmigrations',\n  schema: '.\u002Fserver\u002Fdatabase\u002Fschema.ts',\n  dialect: 'postgresql',\n  dbCredentials: {\n    \u002F\u002F the development socket, for `studio` and `check` while `nuxt dev` runs\n    url: 'postgres:\u002F\u002Fpostgres@127.0.0.1:5456\u002Fpostgres',\n  },\n})\n","drizzle.config.ts",[218,902,903,923,927,932,944,960,976,992,1001,1006,1022,1027],{"__ignoreMap":242},[246,904,905,907,909,912,914,916,918,921],{"class":248,"line":249},[246,906,666],{"class":252},[246,908,318],{"class":267},[246,910,911],{"class":263}," defineConfig",[246,913,684],{"class":267},[246,915,687],{"class":252},[246,917,396],{"class":267},[246,919,920],{"class":287},"drizzle-kit",[246,922,695],{"class":267},[246,924,925],{"class":248,"line":271},[246,926,701],{"emptyLinePlaceholder":700},[246,928,929],{"class":248,"line":299},[246,930,931],{"class":333},"\u002F\u002F Netlify applies `out` on deploy and `init` applies it locally: no `push`\u002F`migrate`.\n",[246,933,934,936,938,940,942],{"class":248,"line":310},[246,935,253],{"class":252},[246,937,256],{"class":252},[246,939,911],{"class":259},[246,941,264],{"class":263},[246,943,268],{"class":267},[246,945,946,949,951,953,956,958],{"class":248,"line":337},[246,947,948],{"class":274},"  out",[246,950,278],{"class":267},[246,952,396],{"class":267},[246,954,955],{"class":287},".\u002Fnetlify\u002Fdatabase\u002Fmigrations",[246,957,284],{"class":267},[246,959,296],{"class":267},[246,961,962,965,967,969,972,974],{"class":248,"line":347},[246,963,964],{"class":274},"  schema",[246,966,278],{"class":267},[246,968,396],{"class":267},[246,970,971],{"class":287},".\u002Fserver\u002Fdatabase\u002Fschema.ts",[246,973,284],{"class":267},[246,975,296],{"class":267},[246,977,978,981,983,985,988,990],{"class":248,"line":364},[246,979,980],{"class":274},"  dialect",[246,982,278],{"class":267},[246,984,396],{"class":267},[246,986,987],{"class":287},"postgresql",[246,989,284],{"class":267},[246,991,296],{"class":267},[246,993,994,997,999],{"class":248,"line":370},[246,995,996],{"class":274},"  dbCredentials",[246,998,278],{"class":267},[246,1000,307],{"class":267},[246,1002,1003],{"class":248,"line":408},[246,1004,1005],{"class":333},"    \u002F\u002F the development socket, for `studio` and `check` while `nuxt dev` runs\n",[246,1007,1008,1011,1013,1015,1018,1020],{"class":248,"line":414},[246,1009,1010],{"class":274},"    url",[246,1012,278],{"class":267},[246,1014,396],{"class":267},[246,1016,1017],{"class":287},"postgres:\u002F\u002Fpostgres@127.0.0.1:5456\u002Fpostgres",[246,1019,284],{"class":267},[246,1021,296],{"class":267},[246,1023,1025],{"class":248,"line":1024},11,[246,1026,411],{"class":267},[246,1028,1030,1032],{"class":248,"line":1029},12,[246,1031,417],{"class":267},[246,1033,420],{"class":263},[236,1035,1039],{"className":1036,"code":1037,"filename":93,"language":1038,"meta":242,"style":242},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx drizzle-kit generate --name init\n","bash",[218,1040,1041],{"__ignoreMap":242},[246,1042,1043,1047,1050,1053,1056],{"class":248,"line":249},[246,1044,1046],{"class":1045},"sBMFI","npx",[246,1048,1049],{"class":287}," drizzle-kit",[246,1051,1052],{"class":287}," generate",[246,1054,1055],{"class":287}," --name",[246,1057,1058],{"class":287}," init\n",[214,1060,1061,1062,1065],{},"Commit the generated ",[218,1063,1064],{},"netlify\u002Fdatabase\u002Fmigrations\u002F\u003Ctimestamp>_init\u002F"," directory: the deploy is what applies it.",[1067,1068,1069],"warning",{},[214,1070,1071,1072,1075,1076,1079,1080,1082],{},"Never run ",[218,1073,1074],{},"drizzle-kit push"," or ",[218,1077,1078],{},"drizzle-kit migrate"," against the site's database. Netlify records the files it applied in ",[218,1081,530],{},"; a schema pushed or migrated by another tool is one it does not know about, and the next deploy's migrations run against it.",[652,1084,1086],{"id":1085},"apply-them-in-development","Apply them in development",[214,1088,1089,1090,1092],{},"The socket's instance applies the same files from ",[218,1091,511],{},", with the same bookkeeping as Netlify:",[236,1094,1096],{"className":238,"code":1095,"filename":607,"language":241,"meta":242,"style":242},"import { fileURLToPath } from 'node:url'\n\nimport { applyMigrations } from 'nuxt-pglite\u002Fmigrations'\n\nconst migrations = fileURLToPath(new URL('..\u002Fnetlify\u002Fdatabase\u002Fmigrations', import.meta.url))\n\nexport default definePGliteServerConfig({\n  init: (pg) => applyMigrations(pg, migrations),\n})\n",[218,1097,1098,1118,1122,1142,1146,1190,1194,1207,1237],{"__ignoreMap":242},[246,1099,1100,1102,1104,1107,1109,1111,1113,1116],{"class":248,"line":249},[246,1101,666],{"class":252},[246,1103,318],{"class":267},[246,1105,1106],{"class":263}," fileURLToPath",[246,1108,684],{"class":267},[246,1110,687],{"class":252},[246,1112,396],{"class":267},[246,1114,1115],{"class":287},"node:url",[246,1117,695],{"class":267},[246,1119,1120],{"class":248,"line":271},[246,1121,701],{"emptyLinePlaceholder":700},[246,1123,1124,1126,1128,1131,1133,1135,1137,1140],{"class":248,"line":299},[246,1125,666],{"class":252},[246,1127,318],{"class":267},[246,1129,1130],{"class":263}," applyMigrations",[246,1132,684],{"class":267},[246,1134,687],{"class":252},[246,1136,396],{"class":267},[246,1138,1139],{"class":287},"nuxt-pglite\u002Fmigrations",[246,1141,695],{"class":267},[246,1143,1144],{"class":248,"line":310},[246,1145,701],{"emptyLinePlaceholder":700},[246,1147,1148,1151,1154,1156,1158,1160,1163,1166,1168,1170,1173,1175,1177,1180,1182,1185,1187],{"class":248,"line":337},[246,1149,1150],{"class":708},"const",[246,1152,1153],{"class":263}," migrations ",[246,1155,715],{"class":267},[246,1157,1106],{"class":259},[246,1159,264],{"class":263},[246,1161,1162],{"class":267},"new",[246,1164,1165],{"class":259}," URL",[246,1167,264],{"class":263},[246,1169,284],{"class":267},[246,1171,1172],{"class":287},"..\u002Fnetlify\u002Fdatabase\u002Fmigrations",[246,1174,284],{"class":267},[246,1176,358],{"class":267},[246,1178,1179],{"class":252}," import",[246,1181,753],{"class":267},[246,1183,1184],{"class":263},"meta",[246,1186,753],{"class":267},[246,1188,1189],{"class":263},"url))\n",[246,1191,1192],{"class":248,"line":347},[246,1193,701],{"emptyLinePlaceholder":700},[246,1195,1196,1198,1200,1203,1205],{"class":248,"line":364},[246,1197,253],{"class":252},[246,1199,256],{"class":252},[246,1201,1202],{"class":259}," definePGliteServerConfig",[246,1204,264],{"class":263},[246,1206,268],{"class":267},[246,1208,1209,1212,1214,1217,1220,1222,1225,1227,1230,1232,1235],{"class":248,"line":370},[246,1210,1211],{"class":259},"  init",[246,1213,278],{"class":267},[246,1215,1216],{"class":267}," (",[246,1218,495],{"class":1219},"sHdIc",[246,1221,597],{"class":267},[246,1223,1224],{"class":708}," =>",[246,1226,1130],{"class":259},[246,1228,1229],{"class":263},"(pg",[246,1231,358],{"class":267},[246,1233,1234],{"class":263}," migrations)",[246,1236,296],{"class":267},[246,1238,1239,1241],{"class":248,"line":408},[246,1240,417],{"class":267},[246,1242,420],{"class":263},[652,1244,1246,1247],{"id":1245},"query-through-drizzle-ormnetlify-db","Query through ",[218,1248,544],{},[214,1250,1251,1252,1255,1256,1258,1259,1261,1262,1264,1265,1267,1268,1270,1271,1273,1274,1276,1277,1279],{},"Called with no connection, ",[218,1253,1254],{},"drizzle()"," from ",[218,1257,544],{}," reads ",[218,1260,431],{},", and picks ",[218,1263,495],{}," when ",[218,1266,486],{}," is ",[218,1269,491],{},", which is what the socket exports, or Neon's serverless driver otherwise, which is what Netlify runs. It needs ",[218,1272,495],{}," and ",[218,1275,639],{}," installed, and throws when ",[218,1278,431],{}," is unset, so this site checks first:",[236,1281,1284],{"className":238,"code":1282,"filename":1283,"language":241,"meta":242,"style":242},"import { drizzle } from 'drizzle-orm\u002Fnetlify-db'\n\nimport { relations } from '..\u002Fdatabase\u002Frelations'\n\nfunction createDB() {\n  return drizzle({ relations })\n}\n\nlet db: ReturnType\u003Ctypeof createDB> | undefined\n\n\u002F** `undefined` without `NETLIFY_DB_URL`, so the routes can say so. *\u002F\nexport function useDB() {\n  if (!process.env.NETLIFY_DB_URL) {\n    return undefined\n  }\n  db ??= createDB()\n  return db\n}\n","server\u002Futils\u002Fdb.ts",[218,1285,1286,1305,1309,1329,1333,1345,1363,1368,1372,1399,1403,1408,1422,1450,1458,1464,1478,1486],{"__ignoreMap":242},[246,1287,1288,1290,1292,1295,1297,1299,1301,1303],{"class":248,"line":249},[246,1289,666],{"class":252},[246,1291,318],{"class":267},[246,1293,1294],{"class":263}," drizzle",[246,1296,684],{"class":267},[246,1298,687],{"class":252},[246,1300,396],{"class":267},[246,1302,544],{"class":287},[246,1304,695],{"class":267},[246,1306,1307],{"class":248,"line":271},[246,1308,701],{"emptyLinePlaceholder":700},[246,1310,1311,1313,1315,1318,1320,1322,1324,1327],{"class":248,"line":299},[246,1312,666],{"class":252},[246,1314,318],{"class":267},[246,1316,1317],{"class":263}," relations",[246,1319,684],{"class":267},[246,1321,687],{"class":252},[246,1323,396],{"class":267},[246,1325,1326],{"class":287},"..\u002Fdatabase\u002Frelations",[246,1328,695],{"class":267},[246,1330,1331],{"class":248,"line":310},[246,1332,701],{"emptyLinePlaceholder":700},[246,1334,1335,1338,1341,1343],{"class":248,"line":337},[246,1336,1337],{"class":708},"function",[246,1339,1340],{"class":259}," createDB",[246,1342,759],{"class":267},[246,1344,307],{"class":267},[246,1346,1347,1350,1352,1354,1357,1359,1361],{"class":248,"line":347},[246,1348,1349],{"class":252},"  return",[246,1351,1294],{"class":259},[246,1353,264],{"class":274},[246,1355,1356],{"class":267},"{",[246,1358,1317],{"class":263},[246,1360,684],{"class":267},[246,1362,420],{"class":274},[246,1364,1365],{"class":248,"line":364},[246,1366,1367],{"class":267},"}\n",[246,1369,1370],{"class":248,"line":370},[246,1371,701],{"emptyLinePlaceholder":700},[246,1373,1374,1377,1380,1382,1385,1388,1390,1393,1396],{"class":248,"line":408},[246,1375,1376],{"class":708},"let",[246,1378,1379],{"class":263}," db",[246,1381,278],{"class":267},[246,1383,1384],{"class":1045}," ReturnType",[246,1386,1387],{"class":267},"\u003Ctypeof",[246,1389,1340],{"class":263},[246,1391,1392],{"class":267},">",[246,1394,1395],{"class":267}," |",[246,1397,1398],{"class":1045}," undefined\n",[246,1400,1401],{"class":248,"line":414},[246,1402,701],{"emptyLinePlaceholder":700},[246,1404,1405],{"class":248,"line":1024},[246,1406,1407],{"class":333},"\u002F** `undefined` without `NETLIFY_DB_URL`, so the routes can say so. *\u002F\n",[246,1409,1410,1412,1415,1418,1420],{"class":248,"line":1029},[246,1411,253],{"class":252},[246,1413,1414],{"class":708}," function",[246,1416,1417],{"class":259}," useDB",[246,1419,759],{"class":267},[246,1421,307],{"class":267},[246,1423,1425,1428,1430,1433,1436,1438,1441,1443,1445,1448],{"class":248,"line":1424},13,[246,1426,1427],{"class":252},"  if",[246,1429,1216],{"class":274},[246,1431,1432],{"class":267},"!",[246,1434,1435],{"class":263},"process",[246,1437,753],{"class":267},[246,1439,1440],{"class":263},"env",[246,1442,753],{"class":267},[246,1444,431],{"class":263},[246,1446,1447],{"class":274},") ",[246,1449,268],{"class":267},[246,1451,1453,1456],{"class":248,"line":1452},14,[246,1454,1455],{"class":252},"    return",[246,1457,1398],{"class":267},[246,1459,1461],{"class":248,"line":1460},15,[246,1462,1463],{"class":267},"  }\n",[246,1465,1467,1470,1473,1475],{"class":248,"line":1466},16,[246,1468,1469],{"class":263},"  db",[246,1471,1472],{"class":267}," ??=",[246,1474,1340],{"class":259},[246,1476,1477],{"class":274},"()\n",[246,1479,1481,1483],{"class":248,"line":1480},17,[246,1482,1349],{"class":252},[246,1484,1485],{"class":263}," db\n",[246,1487,1489],{"class":248,"line":1488},18,[246,1490,1367],{"class":267},[652,1492,1494,1495],{"id":1493},"add-a-netlifytoml","Add a ",[218,1496,1497],{},"netlify.toml",[214,1499,1500,1501,1503],{},"Netlify detects Nitro, which picks its ",[218,1502,228],{}," preset by itself. In a monorepo, point the build at the app's directory:",[236,1505,1509],{"className":1506,"code":1507,"filename":1497,"language":1508,"meta":242,"style":242},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Netlify applies `netlify\u002Fdatabase\u002Fmigrations` itself before publishing: no migration command.\n[build]\n  base = \"docs\"\n  command = \"pnpm build\"\n  publish = \"dist\"\n\n[build.environment]\n  NODE_VERSION = \"24\"\n","toml",[218,1510,1511,1516,1521,1526,1531,1536,1540,1545],{"__ignoreMap":242},[246,1512,1513],{"class":248,"line":249},[246,1514,1515],{},"# Netlify applies `netlify\u002Fdatabase\u002Fmigrations` itself before publishing: no migration command.\n",[246,1517,1518],{"class":248,"line":271},[246,1519,1520],{},"[build]\n",[246,1522,1523],{"class":248,"line":299},[246,1524,1525],{},"  base = \"docs\"\n",[246,1527,1528],{"class":248,"line":310},[246,1529,1530],{},"  command = \"pnpm build\"\n",[246,1532,1533],{"class":248,"line":337},[246,1534,1535],{},"  publish = \"dist\"\n",[246,1537,1538],{"class":248,"line":347},[246,1539,701],{"emptyLinePlaceholder":700},[246,1541,1542],{"class":248,"line":364},[246,1543,1544],{},"[build.environment]\n",[246,1546,1547],{"class":248,"line":370},[246,1548,1549],{},"  NODE_VERSION = \"24\"\n",[214,1551,1552,1555,1556,1559,1560,1562,1563,1566,1567,1570,1571,753],{},[218,1553,1554],{},"publish"," is relative to ",[218,1557,1558],{},"base",": the ",[218,1561,228],{}," preset writes the static files to ",[218,1564,1565],{},"dist"," and the server to ",[218,1568,1569],{},".netlify\u002Ffunctions-internal",". For an app at the root of its repository, drop ",[218,1572,1558],{},[652,1574,1576],{"id":1575},"enable-netlify-database-on-the-site","Enable Netlify Database on the site",[214,1578,1579,1580,1583,1584,1588,1589,1591],{},"Netlify provisions the database for sites that depend on ",[218,1581,1582],{},"@netlify\u002Fdatabase","; otherwise, enable it from the site's ",[1585,1586,1587],"strong",{},"Data & Storage → Database"," page in the Netlify UI. Once enabled, ",[218,1590,431],{}," is set for builds and functions with nothing to configure.",[652,1593,139],{"id":1594},"deploy",[214,1596,1597,1598,1601],{},"Push to the branch Netlify builds, or run ",[218,1599,1600],{},"netlify deploy --build",". Netlify applies the pending migrations before publishing, and a failing one blocks the publish.",[214,1603,1604,1605,1607,1608,1612],{},"Without the database enabled, the site still deploys and every page works; the routes that need the database answer with a \"no database configured\" message naming ",[218,1606,431],{},". The ",[223,1609,1611],{"href":1610},"#try-it","demo above"," shows which case this deployment is in.",[1614,1615,1616],"note",{},[214,1617,1618,1619,1624,1625,1627],{},"Netlify also refuses migrations edited or removed after they were applied. Locally, ",[223,1620,1621,1623],{"href":113},[218,1622,517],{}," does the same",", so the mistake shows up in ",[218,1626,456],{}," rather than in a failed deploy.",[1629,1630,1631],"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}",{"title":242,"searchDepth":249,"depth":271,"links":1633},[1634,1635,1636,1637],{"id":424,"depth":271,"text":425},{"id":548,"depth":271,"text":549},{"id":568,"depth":271,"text":569},{"id":646,"depth":271,"text":647},"Netlify Database in production, the socket's netlify preset in development, and the committed migrations applied by Netlify on deploy. This site is the worked example.","md",null,{},{"icon":153},{"title":150,"description":1638},"e6rIC8HVspaFtgGs-4alYYrry3EAyalVZzk0qH7rAfA",[1646,1648],{"title":145,"path":146,"stem":147,"description":1647,"icon":148,"children":-1},"Deploy against a Postgres reached through DATABASE_URL, on any host Nitro supports, with the migrations applied from the build or CI.",{"title":155,"path":156,"stem":157,"description":1649,"icon":158,"children":-1},"Neon's HTTP and WebSocket drivers in production, node-postgres against the socket in development, and the migrations applied from CI.",1791474261629]