[{"data":1,"prerenderedAt":3599},["ShallowReactive",2],{"navigation":3,"/docs/database":137,"/docs/database-surround":3594},[4,123],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":113},"Docs","i-lucide-book","/docs","docs",[10,34,58,73,84,95,114],{"title":11,"path":12,"stem":13,"children":14,"icon":33},"Getting Started","/docs/getting-started","docs/1.getting-started/1.index",[15,17,21,25,29],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","/docs/getting-started/installation","docs/1.getting-started/2.installation",{"title":22,"path":23,"stem":24},"Deploy","/docs/getting-started/deploy","docs/1.getting-started/3.deploy",{"title":26,"path":27,"stem":28},"Migration","/docs/getting-started/migration","docs/1.getting-started/4.migration",{"title":30,"path":31,"stem":32},"Environments","/docs/getting-started/environments","docs/1.getting-started/5.environments","i-lucide-rocket",{"title":35,"path":36,"stem":37,"children":38,"icon":57},"Database","/docs/database","docs/2.database/1.index",[39,41,45,49,53],{"title":40,"path":36,"stem":37},"Setup",{"title":42,"path":43,"stem":44},"Schema","/docs/database/schema","docs/2.database/2.schema",{"title":46,"path":47,"stem":48},"Queries","/docs/database/query","docs/2.database/3.query",{"title":50,"path":51,"stem":52},"Migrations","/docs/database/migrations","docs/2.database/4.migrations",{"title":54,"path":55,"stem":56},"CLI","/docs/database/cli","docs/2.database/cli","i-lucide-database",{"title":59,"path":60,"stem":61,"children":62,"icon":72},"Blob","/docs/blob","docs/3.blob/1.index",[63,64,68],{"title":40,"path":60,"stem":61},{"title":65,"path":66,"stem":67},"Upload","/docs/blob/upload","docs/3.blob/2.upload",{"title":69,"path":70,"stem":71},"Blob SDK","/docs/blob/usage","docs/3.blob/3.usage","i-lucide-shapes",{"title":74,"path":75,"stem":76,"children":77,"icon":83},"Key Value","/docs/kv","docs/4.kv/1.index",[78,79],{"title":40,"path":75,"stem":76},{"title":80,"path":81,"stem":82},"KV SDK","/docs/kv/usage","docs/4.kv/2.usage","i-lucide-list",{"title":85,"path":86,"stem":87,"children":88,"icon":94},"Cache","/docs/cache","docs/5.cache/1.index",[89,90],{"title":40,"path":86,"stem":87},{"title":91,"path":92,"stem":93},"Usage","/docs/cache/usage","docs/5.cache/2.usage","i-lucide-zap",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":113},"Guides","i-lucide-book-text","/docs/guides","docs/6.guides",[101,105,109],{"title":102,"path":103,"stem":104},"Pre-rendering","/docs/guides/pre-rendering","docs/6.guides/1.pre-rendering",{"title":106,"path":107,"stem":108},"Realtime","/docs/guides/realtime","docs/6.guides/2.realtime",{"title":110,"path":111,"stem":112},"CI/CD","/docs/guides/ci-cd","docs/6.guides/3.ci-cd",false,{"title":115,"path":116,"stem":117,"children":118,"page":113},"Reference","/docs/reference","docs/7.reference",[119],{"title":120,"path":121,"stem":122},"Environment Variables","/docs/reference/environment-variables","docs/7.reference/1.environment-variables",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":113},"Changelog","i-lucide-megaphone","/changelog","changelog",[129,133],{"title":130,"path":131,"stem":132},"NuxtHub Multi-Vendor is now available","/changelog/nuxthub-multi-vendor","changelog/nuxthub-multi-vendor",{"title":134,"path":135,"stem":136},"Self-Hosting First & Cloud-Agnostic Future","/changelog/self-hosting-first","changelog/self-hosting-first",{"id":138,"title":139,"body":140,"description":3588,"extension":3021,"links":3589,"meta":3590,"navigation":3591,"path":36,"seo":3592,"stem":37,"__hash__":3593},"docs/docs/2.database/1.index.md","Nuxt SQL Database",{"type":141,"value":142,"toc":3564},"minimark",[143,155,160,1227,1231,1245,1252,1256,1260,1659,1667,1671,1674,1789,1793,1808,1882,1885,2055,2065,2069,2076,2149,2152,2202,2216,2220,2229,2302,2305,2307,2310,2336,2348,2352,2355,2649,2652,2747,2754,2758,2774,2779,3003,3007,3017,3304,3308,3318,3322,3332,3373,3382,3386,3396,3433,3436,3440,3446,3451,3509,3514,3551,3555,3560],[144,145,146,147,154],"p",{},"NuxtHub Database provides a type-safe SQL database powered by ",[148,149,153],"a",{"href":150,"rel":151},"https://orm.drizzle.team",[152],"nofollow","Drizzle ORM",", supporting PostgreSQL, MySQL, and SQLite with smart detection and automatic migrations at build time.",[156,157,159],"h2",{"id":158},"getting-started","Getting started",[161,162,164,169,172,316,320,324,334,517,521,524,1166,1173,1177,1180,1203,1210,1219],"steps",{"level":163},"3",[165,166,168],"h3",{"id":167},"install-dependencies","Install dependencies",[144,170,171],{},"Install Drizzle ORM, Drizzle Kit, and the appropriate driver(s) for the database you are using:",[173,174,176,238,265],"tabs",{"sync":175},"database-dialect",[177,178,181,185],"tabs-item",{"icon":179,"label":180},"i-simple-icons-postgresql","PostgreSQL",[182,183],"pm-install",{"name":184},"drizzle-orm drizzle-kit postgres @electric-sql/pglite",[186,187,188,191],"callout",{},[144,189,190],{},"NuxtHub automatically detects your database connection using environment variables:",[192,193,194,203,221],"ul",{},[195,196,197,198,202],"li",{},"Uses ",[199,200,201],"code",{},"PGlite"," (embedded PostgreSQL) if no environment variables are set.",[195,204,197,205,208,209,212,213,216,217,220],{},[199,206,207],{},"postgres-js"," driver if you set ",[199,210,211],{},"DATABASE_URL",", ",[199,214,215],{},"POSTGRES_URL",", or ",[199,218,219],{},"POSTGRESQL_URL"," environment variable.",[195,222,223,224,227,228,231,232,237],{},"Use ",[199,225,226],{},"neon-http"," driver with ",[199,229,230],{},"@neondatabase/serverless"," for ",[148,233,236],{"href":234,"rel":235},"https://neon.com",[152],"Neon"," serverless PostgreSQL.",[177,239,242,245],{"icon":240,"label":241},"i-simple-icons-mysql","MySQL",[182,243],{"name":244},"drizzle-orm drizzle-kit mysql2",[186,246,247,249],{},[144,248,190],{},[192,250,251,262],{},[195,252,197,253,208,256,258,259,220],{},[199,254,255],{},"mysql2",[199,257,211],{}," or ",[199,260,261],{},"MYSQL_URL",[195,263,264],{},"Requires environment variable (no local fallback).",[177,266,269,272,307],{"icon":267,"label":268},"i-simple-icons-sqlite","SQLite",[182,270],{"name":271},"drizzle-orm drizzle-kit @libsql/client",[186,273,274,276],{},[144,275,190],{},[192,277,278,298],{},[195,279,197,280,283,284,289,290,293,294,297],{},[199,281,282],{},"libsql"," driver for ",[148,285,288],{"href":286,"rel":287},"https://turso.tech",[152],"Turso"," if you set ",[199,291,292],{},"TURSO_DATABASE_URL"," and ",[199,295,296],{},"TURSO_AUTH_TOKEN"," environment variables.",[195,299,197,300,302,303,306],{},[199,301,282],{}," locally with file at ",[199,304,305],{},".data/db/sqlite.db"," if no environment variables are set.",[308,309,311,312,315],"tip",{"to":310},"/docs/getting-started/deploy#cloudflare","For Cloudflare D1, configure the database ID in your ",[199,313,314],{},"nuxt.config.ts"," and NuxtHub auto-generates the wrangler bindings.",[308,317,319],{"to":318},"#dockerkubernetes-deployments","For containerized deployments, you can defer environment variables to runtime.",[165,321,323],{"id":322},"set-sql-dialect","Set SQL dialect",[144,325,326,327,329,330,333],{},"Enable the database in your ",[199,328,314],{}," by setting the ",[199,331,332],{},"db"," property to your desired SQL dialect:",[173,335,336,417,467],{"sync":175},[177,337,338],{"icon":179,"label":180},[339,340,345],"pre",{"className":341,"code":342,"filename":314,"language":343,"meta":344,"style":344},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  hub: {\n    db: 'postgresql'\n  }\n})\n","ts","",[199,346,347,371,384,402,408],{"__ignoreMap":344},[348,349,352,356,359,363,367],"span",{"class":350,"line":351},"line",1,[348,353,355],{"class":354},"s7zQu","export",[348,357,358],{"class":354}," default",[348,360,362],{"class":361},"s2Zo4"," defineNuxtConfig",[348,364,366],{"class":365},"sTEyZ","(",[348,368,370],{"class":369},"sMK4o","{\n",[348,372,374,378,381],{"class":350,"line":373},2,[348,375,377],{"class":376},"swJcz","  hub",[348,379,380],{"class":369},":",[348,382,383],{"class":369}," {\n",[348,385,387,390,392,395,399],{"class":350,"line":386},3,[348,388,389],{"class":376},"    db",[348,391,380],{"class":369},[348,393,394],{"class":369}," '",[348,396,398],{"class":397},"sfazB","postgresql",[348,400,401],{"class":369},"'\n",[348,403,405],{"class":350,"line":404},4,[348,406,407],{"class":369},"  }\n",[348,409,411,414],{"class":350,"line":410},5,[348,412,413],{"class":369},"}",[348,415,416],{"class":365},")\n",[177,418,419],{"icon":240,"label":241},[339,420,422],{"className":341,"code":421,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: 'mysql'\n  }\n})\n",[199,423,424,436,444,457,461],{"__ignoreMap":344},[348,425,426,428,430,432,434],{"class":350,"line":351},[348,427,355],{"class":354},[348,429,358],{"class":354},[348,431,362],{"class":361},[348,433,366],{"class":365},[348,435,370],{"class":369},[348,437,438,440,442],{"class":350,"line":373},[348,439,377],{"class":376},[348,441,380],{"class":369},[348,443,383],{"class":369},[348,445,446,448,450,452,455],{"class":350,"line":386},[348,447,389],{"class":376},[348,449,380],{"class":369},[348,451,394],{"class":369},[348,453,454],{"class":397},"mysql",[348,456,401],{"class":369},[348,458,459],{"class":350,"line":404},[348,460,407],{"class":369},[348,462,463,465],{"class":350,"line":410},[348,464,413],{"class":369},[348,466,416],{"class":365},[177,468,469],{"icon":267,"label":268},[339,470,472],{"className":341,"code":471,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: 'sqlite'\n  }\n})\n",[199,473,474,486,494,507,511],{"__ignoreMap":344},[348,475,476,478,480,482,484],{"class":350,"line":351},[348,477,355],{"class":354},[348,479,358],{"class":354},[348,481,362],{"class":361},[348,483,366],{"class":365},[348,485,370],{"class":369},[348,487,488,490,492],{"class":350,"line":373},[348,489,377],{"class":376},[348,491,380],{"class":369},[348,493,383],{"class":369},[348,495,496,498,500,502,505],{"class":350,"line":386},[348,497,389],{"class":376},[348,499,380],{"class":369},[348,501,394],{"class":369},[348,503,504],{"class":397},"sqlite",[348,506,401],{"class":369},[348,508,509],{"class":350,"line":404},[348,510,407],{"class":369},[348,512,513,515],{"class":350,"line":410},[348,514,413],{"class":369},[348,516,416],{"class":365},[165,518,520],{"id":519},"database-schema","Database schema",[144,522,523],{},"Create your database schema with full TypeScript support using Drizzle ORM:",[173,525,526,754,947],{"sync":175},[177,527,528],{"icon":179,"label":180},[339,529,532],{"className":341,"code":530,"filename":531,"language":343,"meta":344,"style":344},"import { pgTable, text, serial, timestamp } from 'drizzle-orm/pg-core'\n\nexport const users = pgTable('users', {\n  id: serial().primaryKey(),\n  name: text().notNull(),\n  email: text().notNull().unique(),\n  password: text().notNull(),\n  avatar: text().notNull(),\n  createdAt: timestamp().notNull().defaultNow(),\n})\n","server/db/schema.ts",[199,533,534,574,580,610,633,653,680,700,720,747],{"__ignoreMap":344},[348,535,536,539,542,545,548,551,553,556,558,561,564,567,569,572],{"class":350,"line":351},[348,537,538],{"class":354},"import",[348,540,541],{"class":369}," {",[348,543,544],{"class":365}," pgTable",[348,546,547],{"class":369},",",[348,549,550],{"class":365}," text",[348,552,547],{"class":369},[348,554,555],{"class":365}," serial",[348,557,547],{"class":369},[348,559,560],{"class":365}," timestamp",[348,562,563],{"class":369}," }",[348,565,566],{"class":354}," from",[348,568,394],{"class":369},[348,570,571],{"class":397},"drizzle-orm/pg-core",[348,573,401],{"class":369},[348,575,576],{"class":350,"line":373},[348,577,579],{"emptyLinePlaceholder":578},true,"\n",[348,581,582,584,588,591,594,596,598,601,604,606,608],{"class":350,"line":386},[348,583,355],{"class":354},[348,585,587],{"class":586},"spNyl"," const",[348,589,590],{"class":365}," users ",[348,592,593],{"class":369},"=",[348,595,544],{"class":361},[348,597,366],{"class":365},[348,599,600],{"class":369},"'",[348,602,603],{"class":397},"users",[348,605,600],{"class":369},[348,607,547],{"class":369},[348,609,383],{"class":369},[348,611,612,615,617,619,622,625,628,630],{"class":350,"line":404},[348,613,614],{"class":376},"  id",[348,616,380],{"class":369},[348,618,555],{"class":361},[348,620,621],{"class":365},"()",[348,623,624],{"class":369},".",[348,626,627],{"class":361},"primaryKey",[348,629,621],{"class":365},[348,631,632],{"class":369},",\n",[348,634,635,638,640,642,644,646,649,651],{"class":350,"line":410},[348,636,637],{"class":376},"  name",[348,639,380],{"class":369},[348,641,550],{"class":361},[348,643,621],{"class":365},[348,645,624],{"class":369},[348,647,648],{"class":361},"notNull",[348,650,621],{"class":365},[348,652,632],{"class":369},[348,654,656,659,661,663,665,667,669,671,673,676,678],{"class":350,"line":655},6,[348,657,658],{"class":376},"  email",[348,660,380],{"class":369},[348,662,550],{"class":361},[348,664,621],{"class":365},[348,666,624],{"class":369},[348,668,648],{"class":361},[348,670,621],{"class":365},[348,672,624],{"class":369},[348,674,675],{"class":361},"unique",[348,677,621],{"class":365},[348,679,632],{"class":369},[348,681,683,686,688,690,692,694,696,698],{"class":350,"line":682},7,[348,684,685],{"class":376},"  password",[348,687,380],{"class":369},[348,689,550],{"class":361},[348,691,621],{"class":365},[348,693,624],{"class":369},[348,695,648],{"class":361},[348,697,621],{"class":365},[348,699,632],{"class":369},[348,701,703,706,708,710,712,714,716,718],{"class":350,"line":702},8,[348,704,705],{"class":376},"  avatar",[348,707,380],{"class":369},[348,709,550],{"class":361},[348,711,621],{"class":365},[348,713,624],{"class":369},[348,715,648],{"class":361},[348,717,621],{"class":365},[348,719,632],{"class":369},[348,721,723,726,728,730,732,734,736,738,740,743,745],{"class":350,"line":722},9,[348,724,725],{"class":376},"  createdAt",[348,727,380],{"class":369},[348,729,560],{"class":361},[348,731,621],{"class":365},[348,733,624],{"class":369},[348,735,648],{"class":361},[348,737,621],{"class":365},[348,739,624],{"class":369},[348,741,742],{"class":361},"defaultNow",[348,744,621],{"class":365},[348,746,632],{"class":369},[348,748,750,752],{"class":350,"line":749},10,[348,751,413],{"class":369},[348,753,416],{"class":365},[177,755,756],{"icon":240,"label":241},[339,757,759],{"className":341,"code":758,"filename":531,"language":343,"meta":344,"style":344},"import { mysqlTable, text, serial, timestamp } from 'drizzle-orm/mysql-core'\n\nexport const users = mysqlTable('users', {\n  id: serial().primaryKey(),\n  name: text().notNull(),\n  email: text().notNull().unique(),\n  password: text().notNull(),\n  avatar: text().notNull(),\n  createdAt: timestamp().notNull().defaultNow(),\n})\n",[199,760,761,793,797,821,839,857,881,899,917,941],{"__ignoreMap":344},[348,762,763,765,767,770,772,774,776,778,780,782,784,786,788,791],{"class":350,"line":351},[348,764,538],{"class":354},[348,766,541],{"class":369},[348,768,769],{"class":365}," mysqlTable",[348,771,547],{"class":369},[348,773,550],{"class":365},[348,775,547],{"class":369},[348,777,555],{"class":365},[348,779,547],{"class":369},[348,781,560],{"class":365},[348,783,563],{"class":369},[348,785,566],{"class":354},[348,787,394],{"class":369},[348,789,790],{"class":397},"drizzle-orm/mysql-core",[348,792,401],{"class":369},[348,794,795],{"class":350,"line":373},[348,796,579],{"emptyLinePlaceholder":578},[348,798,799,801,803,805,807,809,811,813,815,817,819],{"class":350,"line":386},[348,800,355],{"class":354},[348,802,587],{"class":586},[348,804,590],{"class":365},[348,806,593],{"class":369},[348,808,769],{"class":361},[348,810,366],{"class":365},[348,812,600],{"class":369},[348,814,603],{"class":397},[348,816,600],{"class":369},[348,818,547],{"class":369},[348,820,383],{"class":369},[348,822,823,825,827,829,831,833,835,837],{"class":350,"line":404},[348,824,614],{"class":376},[348,826,380],{"class":369},[348,828,555],{"class":361},[348,830,621],{"class":365},[348,832,624],{"class":369},[348,834,627],{"class":361},[348,836,621],{"class":365},[348,838,632],{"class":369},[348,840,841,843,845,847,849,851,853,855],{"class":350,"line":410},[348,842,637],{"class":376},[348,844,380],{"class":369},[348,846,550],{"class":361},[348,848,621],{"class":365},[348,850,624],{"class":369},[348,852,648],{"class":361},[348,854,621],{"class":365},[348,856,632],{"class":369},[348,858,859,861,863,865,867,869,871,873,875,877,879],{"class":350,"line":655},[348,860,658],{"class":376},[348,862,380],{"class":369},[348,864,550],{"class":361},[348,866,621],{"class":365},[348,868,624],{"class":369},[348,870,648],{"class":361},[348,872,621],{"class":365},[348,874,624],{"class":369},[348,876,675],{"class":361},[348,878,621],{"class":365},[348,880,632],{"class":369},[348,882,883,885,887,889,891,893,895,897],{"class":350,"line":682},[348,884,685],{"class":376},[348,886,380],{"class":369},[348,888,550],{"class":361},[348,890,621],{"class":365},[348,892,624],{"class":369},[348,894,648],{"class":361},[348,896,621],{"class":365},[348,898,632],{"class":369},[348,900,901,903,905,907,909,911,913,915],{"class":350,"line":702},[348,902,705],{"class":376},[348,904,380],{"class":369},[348,906,550],{"class":361},[348,908,621],{"class":365},[348,910,624],{"class":369},[348,912,648],{"class":361},[348,914,621],{"class":365},[348,916,632],{"class":369},[348,918,919,921,923,925,927,929,931,933,935,937,939],{"class":350,"line":722},[348,920,725],{"class":376},[348,922,380],{"class":369},[348,924,560],{"class":361},[348,926,621],{"class":365},[348,928,624],{"class":369},[348,930,648],{"class":361},[348,932,621],{"class":365},[348,934,624],{"class":369},[348,936,742],{"class":361},[348,938,621],{"class":365},[348,940,632],{"class":369},[348,942,943,945],{"class":350,"line":749},[348,944,413],{"class":369},[348,946,416],{"class":365},[177,948,949],{"icon":267,"label":268},[339,950,952],{"className":341,"code":951,"filename":531,"language":343,"meta":344,"style":344},"import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'\n\nexport const users = sqliteTable('users', {\n  id: integer().primaryKey({ autoIncrement: true }),\n  name: text().notNull(),\n  email: text().notNull().unique(),\n  password: text().notNull(),\n  avatar: text().notNull(),\n  createdAt: integer({ mode: 'timestamp' }).notNull(),\n})\n",[199,953,954,983,987,1011,1046,1064,1088,1106,1124,1160],{"__ignoreMap":344},[348,955,956,958,960,963,965,967,969,972,974,976,978,981],{"class":350,"line":351},[348,957,538],{"class":354},[348,959,541],{"class":369},[348,961,962],{"class":365}," sqliteTable",[348,964,547],{"class":369},[348,966,550],{"class":365},[348,968,547],{"class":369},[348,970,971],{"class":365}," integer",[348,973,563],{"class":369},[348,975,566],{"class":354},[348,977,394],{"class":369},[348,979,980],{"class":397},"drizzle-orm/sqlite-core",[348,982,401],{"class":369},[348,984,985],{"class":350,"line":373},[348,986,579],{"emptyLinePlaceholder":578},[348,988,989,991,993,995,997,999,1001,1003,1005,1007,1009],{"class":350,"line":386},[348,990,355],{"class":354},[348,992,587],{"class":586},[348,994,590],{"class":365},[348,996,593],{"class":369},[348,998,962],{"class":361},[348,1000,366],{"class":365},[348,1002,600],{"class":369},[348,1004,603],{"class":397},[348,1006,600],{"class":369},[348,1008,547],{"class":369},[348,1010,383],{"class":369},[348,1012,1013,1015,1017,1019,1021,1023,1025,1027,1030,1033,1035,1039,1041,1044],{"class":350,"line":404},[348,1014,614],{"class":376},[348,1016,380],{"class":369},[348,1018,971],{"class":361},[348,1020,621],{"class":365},[348,1022,624],{"class":369},[348,1024,627],{"class":361},[348,1026,366],{"class":365},[348,1028,1029],{"class":369},"{",[348,1031,1032],{"class":376}," autoIncrement",[348,1034,380],{"class":369},[348,1036,1038],{"class":1037},"sfNiH"," true",[348,1040,563],{"class":369},[348,1042,1043],{"class":365},")",[348,1045,632],{"class":369},[348,1047,1048,1050,1052,1054,1056,1058,1060,1062],{"class":350,"line":410},[348,1049,637],{"class":376},[348,1051,380],{"class":369},[348,1053,550],{"class":361},[348,1055,621],{"class":365},[348,1057,624],{"class":369},[348,1059,648],{"class":361},[348,1061,621],{"class":365},[348,1063,632],{"class":369},[348,1065,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086],{"class":350,"line":655},[348,1067,658],{"class":376},[348,1069,380],{"class":369},[348,1071,550],{"class":361},[348,1073,621],{"class":365},[348,1075,624],{"class":369},[348,1077,648],{"class":361},[348,1079,621],{"class":365},[348,1081,624],{"class":369},[348,1083,675],{"class":361},[348,1085,621],{"class":365},[348,1087,632],{"class":369},[348,1089,1090,1092,1094,1096,1098,1100,1102,1104],{"class":350,"line":682},[348,1091,685],{"class":376},[348,1093,380],{"class":369},[348,1095,550],{"class":361},[348,1097,621],{"class":365},[348,1099,624],{"class":369},[348,1101,648],{"class":361},[348,1103,621],{"class":365},[348,1105,632],{"class":369},[348,1107,1108,1110,1112,1114,1116,1118,1120,1122],{"class":350,"line":702},[348,1109,705],{"class":376},[348,1111,380],{"class":369},[348,1113,550],{"class":361},[348,1115,621],{"class":365},[348,1117,624],{"class":369},[348,1119,648],{"class":361},[348,1121,621],{"class":365},[348,1123,632],{"class":369},[348,1125,1126,1128,1130,1132,1134,1136,1139,1141,1143,1146,1148,1150,1152,1154,1156,1158],{"class":350,"line":722},[348,1127,725],{"class":376},[348,1129,380],{"class":369},[348,1131,971],{"class":361},[348,1133,366],{"class":365},[348,1135,1029],{"class":369},[348,1137,1138],{"class":376}," mode",[348,1140,380],{"class":369},[348,1142,394],{"class":369},[348,1144,1145],{"class":397},"timestamp",[348,1147,600],{"class":369},[348,1149,563],{"class":369},[348,1151,1043],{"class":365},[348,1153,624],{"class":369},[348,1155,648],{"class":361},[348,1157,621],{"class":365},[348,1159,632],{"class":369},[348,1161,1162,1164],{"class":350,"line":749},[348,1163,413],{"class":369},[348,1165,416],{"class":365},[186,1167,1168,1169,624],{"to":43},"Learn more about defining the ",[1170,1171,1172],"strong",{},"database schema files",[165,1174,1176],{"id":1175},"generate-migrations","Generate migrations",[144,1178,1179],{},"Generate the database migrations from your schema:",[339,1181,1186],{"className":1182,"code":1183,"filename":1184,"language":1185,"meta":344,"style":344},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx nuxt db generate\n","Terminal","bash",[199,1187,1188],{"__ignoreMap":344},[348,1189,1190,1194,1197,1200],{"class":350,"line":351},[348,1191,1193],{"class":1192},"sBMFI","npx",[348,1195,1196],{"class":397}," nuxt",[348,1198,1199],{"class":397}," db",[348,1201,1202],{"class":397}," generate\n",[144,1204,1205,1206,1209],{},"This creates SQL migration files in ",[199,1207,1208],{},"server/db/migrations/{dialect}/"," which are automatically applied during deployment and development.",[308,1211,1212,1213,1215,1216,624],{"icon":33},"That's it! You can now start your development server and query your database using the ",[199,1214,332],{}," instance from ",[199,1217,1218],{},"@nuxthub/db",[1220,1221,1222,1223,1226],"important",{},"Make sure to run ",[199,1224,1225],{},"npx nuxt db generate"," to generate the database migrations each time you change your database schema and restart the development server.",[156,1228,1230],{"id":1229},"local-development","Local development",[144,1232,1233,1234,1239,1240,380],{},"During local development, view and edit your database from ",[148,1235,1238],{"href":1236,"rel":1237},"https://devtools.nuxt.com",[152],"Nuxt DevTools"," using the ",[148,1241,1244],{"href":1242,"rel":1243},"https://orm.drizzle.team/drizzle-studio/overview",[152],"Drizzle Studio",[1246,1247],"img",{"alt":1248,"height":1249,"src":1250,"width":1251},"Nuxt DevTools Database",515,"/images/landing/nuxt-devtools-database.png",915,[1253,1254,1255],"warning",{},"At the moment, Drizzle Studio does not support SQLite.",[156,1257,1259],{"id":1258},"build-time-hooks","Build-time Hooks",[1261,1262,1263,1359,1456],"field-group",{},[1264,1265,1268,1271],"field",{"name":1266,"type":1267},"'hub:db:migrations:dirs'","(dirs: string[]) => void | Promise\u003Cvoid>",[144,1269,1270],{},"Add additional directories to scan for database migration files (.sql).",[339,1272,1274],{"className":341,"code":1273,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hooks: {\n    'hub:db:migrations:dirs': (dirs) => {\n      dirs.push('my-module/db/migrations')\n    }\n  }\n})\n",[199,1275,1276,1288,1297,1323,1344,1349,1353],{"__ignoreMap":344},[348,1277,1278,1280,1282,1284,1286],{"class":350,"line":351},[348,1279,355],{"class":354},[348,1281,358],{"class":354},[348,1283,362],{"class":361},[348,1285,366],{"class":365},[348,1287,370],{"class":369},[348,1289,1290,1293,1295],{"class":350,"line":373},[348,1291,1292],{"class":376},"  hooks",[348,1294,380],{"class":369},[348,1296,383],{"class":369},[348,1298,1299,1302,1305,1307,1309,1312,1316,1318,1321],{"class":350,"line":386},[348,1300,1301],{"class":369},"    '",[348,1303,1304],{"class":376},"hub:db:migrations:dirs",[348,1306,600],{"class":369},[348,1308,380],{"class":369},[348,1310,1311],{"class":369}," (",[348,1313,1315],{"class":1314},"sHdIc","dirs",[348,1317,1043],{"class":369},[348,1319,1320],{"class":586}," =>",[348,1322,383],{"class":369},[348,1324,1325,1328,1330,1333,1335,1337,1340,1342],{"class":350,"line":404},[348,1326,1327],{"class":365},"      dirs",[348,1329,624],{"class":369},[348,1331,1332],{"class":361},"push",[348,1334,366],{"class":376},[348,1336,600],{"class":369},[348,1338,1339],{"class":397},"my-module/db/migrations",[348,1341,600],{"class":369},[348,1343,416],{"class":376},[348,1345,1346],{"class":350,"line":410},[348,1347,1348],{"class":369},"    }\n",[348,1350,1351],{"class":350,"line":655},[348,1352,407],{"class":369},[348,1354,1355,1357],{"class":350,"line":682},[348,1356,413],{"class":369},[348,1358,416],{"class":365},[1264,1360,1363,1370],{"name":1361,"type":1362},"'hub:db:queries:paths'","(queries: string[], dialect: string) => void | Promise\u003Cvoid>",[144,1364,1365,1366,1369],{},"Add queries that are not tracked in the ",[199,1367,1368],{},"_hub_migrations"," table which are applied after the database migrations complete.",[339,1371,1373],{"className":341,"code":1372,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hooks: {\n    'hub:db:queries:paths': (queries, dialect) => {\n      queries.push('my-module/db/queries')\n    }\n  }\n})\n",[199,1374,1375,1387,1395,1422,1442,1446,1450],{"__ignoreMap":344},[348,1376,1377,1379,1381,1383,1385],{"class":350,"line":351},[348,1378,355],{"class":354},[348,1380,358],{"class":354},[348,1382,362],{"class":361},[348,1384,366],{"class":365},[348,1386,370],{"class":369},[348,1388,1389,1391,1393],{"class":350,"line":373},[348,1390,1292],{"class":376},[348,1392,380],{"class":369},[348,1394,383],{"class":369},[348,1396,1397,1399,1402,1404,1406,1408,1411,1413,1416,1418,1420],{"class":350,"line":386},[348,1398,1301],{"class":369},[348,1400,1401],{"class":376},"hub:db:queries:paths",[348,1403,600],{"class":369},[348,1405,380],{"class":369},[348,1407,1311],{"class":369},[348,1409,1410],{"class":1314},"queries",[348,1412,547],{"class":369},[348,1414,1415],{"class":1314}," dialect",[348,1417,1043],{"class":369},[348,1419,1320],{"class":586},[348,1421,383],{"class":369},[348,1423,1424,1427,1429,1431,1433,1435,1438,1440],{"class":350,"line":404},[348,1425,1426],{"class":365},"      queries",[348,1428,624],{"class":369},[348,1430,1332],{"class":361},[348,1432,366],{"class":376},[348,1434,600],{"class":369},[348,1436,1437],{"class":397},"my-module/db/queries",[348,1439,600],{"class":369},[348,1441,416],{"class":376},[348,1443,1444],{"class":350,"line":410},[348,1445,1348],{"class":369},[348,1447,1448],{"class":350,"line":655},[348,1449,407],{"class":369},[348,1451,1452,1454],{"class":350,"line":682},[348,1453,413],{"class":369},[348,1455,416],{"class":365},[1264,1457,1460,1463],{"name":1458,"type":1459},"'hub:db:schema:extend'","({ paths: string[], dialect: string }) => void | Promise\u003Cvoid>",[144,1461,1462],{},"Extend the database schema with additional files.",[339,1464,1467],{"className":341,"code":1465,"filename":1466,"language":343,"meta":344,"style":344},"import { createResolver, defineNuxtModule } from '@nuxt/kit'\n\nexport default defineNuxtModule({\n  setup(options, nuxt) {\n    const { resolve } = createResolver(import.meta.url)\n\n    nuxt.hook('hub:db:schema:extend', ({ paths, dialect }) => {\n      paths.push(resolve(`./db/schema/pages.${dialect}.ts`))\n    })\n  }\n})\n","modules/my-module/index.ts",[199,1468,1469,1494,1498,1510,1528,1561,1565,1603,1641,1648,1652],{"__ignoreMap":344},[348,1470,1471,1473,1475,1478,1480,1483,1485,1487,1489,1492],{"class":350,"line":351},[348,1472,538],{"class":354},[348,1474,541],{"class":369},[348,1476,1477],{"class":365}," createResolver",[348,1479,547],{"class":369},[348,1481,1482],{"class":365}," defineNuxtModule",[348,1484,563],{"class":369},[348,1486,566],{"class":354},[348,1488,394],{"class":369},[348,1490,1491],{"class":397},"@nuxt/kit",[348,1493,401],{"class":369},[348,1495,1496],{"class":350,"line":373},[348,1497,579],{"emptyLinePlaceholder":578},[348,1499,1500,1502,1504,1506,1508],{"class":350,"line":386},[348,1501,355],{"class":354},[348,1503,358],{"class":354},[348,1505,1482],{"class":361},[348,1507,366],{"class":365},[348,1509,370],{"class":369},[348,1511,1512,1515,1517,1520,1522,1524,1526],{"class":350,"line":404},[348,1513,1514],{"class":376},"  setup",[348,1516,366],{"class":369},[348,1518,1519],{"class":1314},"options",[348,1521,547],{"class":369},[348,1523,1196],{"class":1314},[348,1525,1043],{"class":369},[348,1527,383],{"class":369},[348,1529,1530,1533,1535,1538,1540,1543,1545,1547,1549,1551,1554,1556,1559],{"class":350,"line":410},[348,1531,1532],{"class":586},"    const",[348,1534,541],{"class":369},[348,1536,1537],{"class":365}," resolve",[348,1539,563],{"class":369},[348,1541,1542],{"class":369}," =",[348,1544,1477],{"class":361},[348,1546,366],{"class":376},[348,1548,538],{"class":354},[348,1550,624],{"class":369},[348,1552,1553],{"class":365},"meta",[348,1555,624],{"class":369},[348,1557,1558],{"class":365},"url",[348,1560,416],{"class":376},[348,1562,1563],{"class":350,"line":655},[348,1564,579],{"emptyLinePlaceholder":578},[348,1566,1567,1570,1572,1575,1577,1579,1582,1584,1586,1589,1592,1594,1596,1599,1601],{"class":350,"line":682},[348,1568,1569],{"class":365},"    nuxt",[348,1571,624],{"class":369},[348,1573,1574],{"class":361},"hook",[348,1576,366],{"class":376},[348,1578,600],{"class":369},[348,1580,1581],{"class":397},"hub:db:schema:extend",[348,1583,600],{"class":369},[348,1585,547],{"class":369},[348,1587,1588],{"class":369}," ({",[348,1590,1591],{"class":1314}," paths",[348,1593,547],{"class":369},[348,1595,1415],{"class":1314},[348,1597,1598],{"class":369}," })",[348,1600,1320],{"class":586},[348,1602,383],{"class":369},[348,1604,1605,1608,1610,1612,1614,1617,1619,1622,1625,1628,1631,1633,1636,1638],{"class":350,"line":702},[348,1606,1607],{"class":365},"      paths",[348,1609,624],{"class":369},[348,1611,1332],{"class":361},[348,1613,366],{"class":376},[348,1615,1616],{"class":361},"resolve",[348,1618,366],{"class":376},[348,1620,1621],{"class":369},"`",[348,1623,1624],{"class":397},"./db/schema/pages.",[348,1626,1627],{"class":369},"${",[348,1629,1630],{"class":365},"dialect",[348,1632,413],{"class":369},[348,1634,1635],{"class":397},".ts",[348,1637,1621],{"class":369},[348,1639,1640],{"class":376},"))\n",[348,1642,1643,1646],{"class":350,"line":722},[348,1644,1645],{"class":369},"    }",[348,1647,416],{"class":376},[348,1649,1650],{"class":350,"line":749},[348,1651,407],{"class":369},[348,1653,1655,1657],{"class":350,"line":1654},11,[348,1656,413],{"class":369},[348,1658,416],{"class":365},[1660,1661,1663,1664,624],"note",{"to":1662},"https://nuxt.com/docs/4.x/guide/going-further/hooks#nuxt-hooks-build-time","Learn more about Nuxt server hooks on the ",[1170,1665,1666],{},"Nuxt documentation",[156,1668,1670],{"id":1669},"advanced-configuration","Advanced configuration",[144,1672,1673],{},"For advanced use cases, you can explicitly configure the database connection:",[339,1675,1677],{"className":341,"code":1676,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql',\n      driver: 'postgres-js', // Optional: explicitly choose driver\n      connection: {\n        connectionString: process.env.DATABASE_URL\n      }\n    }\n  }\n})\n",[199,1678,1679,1691,1699,1707,1722,1741,1750,1770,1775,1779,1783],{"__ignoreMap":344},[348,1680,1681,1683,1685,1687,1689],{"class":350,"line":351},[348,1682,355],{"class":354},[348,1684,358],{"class":354},[348,1686,362],{"class":361},[348,1688,366],{"class":365},[348,1690,370],{"class":369},[348,1692,1693,1695,1697],{"class":350,"line":373},[348,1694,377],{"class":376},[348,1696,380],{"class":369},[348,1698,383],{"class":369},[348,1700,1701,1703,1705],{"class":350,"line":386},[348,1702,389],{"class":376},[348,1704,380],{"class":369},[348,1706,383],{"class":369},[348,1708,1709,1712,1714,1716,1718,1720],{"class":350,"line":404},[348,1710,1711],{"class":376},"      dialect",[348,1713,380],{"class":369},[348,1715,394],{"class":369},[348,1717,398],{"class":397},[348,1719,600],{"class":369},[348,1721,632],{"class":369},[348,1723,1724,1727,1729,1731,1733,1735,1737],{"class":350,"line":410},[348,1725,1726],{"class":376},"      driver",[348,1728,380],{"class":369},[348,1730,394],{"class":369},[348,1732,207],{"class":397},[348,1734,600],{"class":369},[348,1736,547],{"class":369},[348,1738,1740],{"class":1739},"sHwdD"," // Optional: explicitly choose driver\n",[348,1742,1743,1746,1748],{"class":350,"line":655},[348,1744,1745],{"class":376},"      connection",[348,1747,380],{"class":369},[348,1749,383],{"class":369},[348,1751,1752,1755,1757,1760,1762,1765,1767],{"class":350,"line":682},[348,1753,1754],{"class":376},"        connectionString",[348,1756,380],{"class":369},[348,1758,1759],{"class":365}," process",[348,1761,624],{"class":369},[348,1763,1764],{"class":365},"env",[348,1766,624],{"class":369},[348,1768,1769],{"class":365},"DATABASE_URL\n",[348,1771,1772],{"class":350,"line":702},[348,1773,1774],{"class":369},"      }\n",[348,1776,1777],{"class":350,"line":722},[348,1778,1348],{"class":369},[348,1780,1781],{"class":350,"line":749},[348,1782,407],{"class":369},[348,1784,1785,1787],{"class":350,"line":1654},[348,1786,413],{"class":369},[348,1788,416],{"class":365},[165,1790,1792],{"id":1791},"column-casing","Column casing",[144,1794,1795,1796,1799,1800,1803,1804,1807],{},"Database model names often use ",[199,1797,1798],{},"snake_case"," conventions, while in TypeScript, it is common to use ",[199,1801,1802],{},"camelCase"," for naming models. To address this, you can use the ",[199,1805,1806],{},"casing"," option to automatically map camelCase JavaScript keys to snake_case in the database:",[339,1809,1811],{"className":341,"code":1810,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql',\n      casing: 'snake_case'\n    }\n  }\n})\n",[199,1812,1813,1825,1833,1841,1855,1868,1872,1876],{"__ignoreMap":344},[348,1814,1815,1817,1819,1821,1823],{"class":350,"line":351},[348,1816,355],{"class":354},[348,1818,358],{"class":354},[348,1820,362],{"class":361},[348,1822,366],{"class":365},[348,1824,370],{"class":369},[348,1826,1827,1829,1831],{"class":350,"line":373},[348,1828,377],{"class":376},[348,1830,380],{"class":369},[348,1832,383],{"class":369},[348,1834,1835,1837,1839],{"class":350,"line":386},[348,1836,389],{"class":376},[348,1838,380],{"class":369},[348,1840,383],{"class":369},[348,1842,1843,1845,1847,1849,1851,1853],{"class":350,"line":404},[348,1844,1711],{"class":376},[348,1846,380],{"class":369},[348,1848,394],{"class":369},[348,1850,398],{"class":397},[348,1852,600],{"class":369},[348,1854,632],{"class":369},[348,1856,1857,1860,1862,1864,1866],{"class":350,"line":410},[348,1858,1859],{"class":376},"      casing",[348,1861,380],{"class":369},[348,1863,394],{"class":369},[348,1865,1798],{"class":397},[348,1867,401],{"class":369},[348,1869,1870],{"class":350,"line":655},[348,1871,1348],{"class":369},[348,1873,1874],{"class":350,"line":682},[348,1875,407],{"class":369},[348,1877,1878,1880],{"class":350,"line":702},[348,1879,413],{"class":369},[348,1881,416],{"class":365},[144,1883,1884],{},"This allows you to use camelCase in your TypeScript schema while Drizzle automatically maps them to snake_case in the database:",[339,1886,1888],{"className":341,"code":1887,"filename":531,"language":343,"meta":344,"style":344},"import { pgTable, text, serial, timestamp } from 'drizzle-orm/pg-core'\n\nexport const users = pgTable('users', {\n  id: serial().primaryKey(),\n  firstName: text().notNull(), // Maps to first_name in the database\n  lastName: text().notNull(),  // Maps to last_name in the database\n  createdAt: timestamp().notNull().default(sql`CURRENT_TIMESTAMP`) // Maps to created_at\n})\n",[199,1889,1890,1920,1924,1948,1966,1988,2010,2049],{"__ignoreMap":344},[348,1891,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918],{"class":350,"line":351},[348,1893,538],{"class":354},[348,1895,541],{"class":369},[348,1897,544],{"class":365},[348,1899,547],{"class":369},[348,1901,550],{"class":365},[348,1903,547],{"class":369},[348,1905,555],{"class":365},[348,1907,547],{"class":369},[348,1909,560],{"class":365},[348,1911,563],{"class":369},[348,1913,566],{"class":354},[348,1915,394],{"class":369},[348,1917,571],{"class":397},[348,1919,401],{"class":369},[348,1921,1922],{"class":350,"line":373},[348,1923,579],{"emptyLinePlaceholder":578},[348,1925,1926,1928,1930,1932,1934,1936,1938,1940,1942,1944,1946],{"class":350,"line":386},[348,1927,355],{"class":354},[348,1929,587],{"class":586},[348,1931,590],{"class":365},[348,1933,593],{"class":369},[348,1935,544],{"class":361},[348,1937,366],{"class":365},[348,1939,600],{"class":369},[348,1941,603],{"class":397},[348,1943,600],{"class":369},[348,1945,547],{"class":369},[348,1947,383],{"class":369},[348,1949,1950,1952,1954,1956,1958,1960,1962,1964],{"class":350,"line":404},[348,1951,614],{"class":376},[348,1953,380],{"class":369},[348,1955,555],{"class":361},[348,1957,621],{"class":365},[348,1959,624],{"class":369},[348,1961,627],{"class":361},[348,1963,621],{"class":365},[348,1965,632],{"class":369},[348,1967,1968,1971,1973,1975,1977,1979,1981,1983,1985],{"class":350,"line":410},[348,1969,1970],{"class":376},"  firstName",[348,1972,380],{"class":369},[348,1974,550],{"class":361},[348,1976,621],{"class":365},[348,1978,624],{"class":369},[348,1980,648],{"class":361},[348,1982,621],{"class":365},[348,1984,547],{"class":369},[348,1986,1987],{"class":1739}," // Maps to first_name in the database\n",[348,1989,1990,1993,1995,1997,1999,2001,2003,2005,2007],{"class":350,"line":655},[348,1991,1992],{"class":376},"  lastName",[348,1994,380],{"class":369},[348,1996,550],{"class":361},[348,1998,621],{"class":365},[348,2000,624],{"class":369},[348,2002,648],{"class":361},[348,2004,621],{"class":365},[348,2006,547],{"class":369},[348,2008,2009],{"class":1739},"  // Maps to last_name in the database\n",[348,2011,2012,2014,2016,2018,2020,2022,2024,2026,2028,2031,2033,2036,2038,2041,2043,2046],{"class":350,"line":682},[348,2013,725],{"class":376},[348,2015,380],{"class":369},[348,2017,560],{"class":361},[348,2019,621],{"class":365},[348,2021,624],{"class":369},[348,2023,648],{"class":361},[348,2025,621],{"class":365},[348,2027,624],{"class":369},[348,2029,2030],{"class":361},"default",[348,2032,366],{"class":365},[348,2034,2035],{"class":361},"sql",[348,2037,1621],{"class":369},[348,2039,2040],{"class":397},"CURRENT_TIMESTAMP",[348,2042,1621],{"class":369},[348,2044,2045],{"class":365},") ",[348,2047,2048],{"class":1739},"// Maps to created_at\n",[348,2050,2051,2053],{"class":350,"line":702},[348,2052,413],{"class":369},[348,2054,416],{"class":365},[186,2056,2059,2060,2064],{"to":2057,":external":2058},"https://orm.drizzle.team/docs/sql-schema-declaration#camel-and-snake-casing","true","Learn more about ",[148,2061,2063],{"href":2057,"rel":2062},[152],"camel and snake casing"," in Drizzle ORM.",[165,2066,2068],{"id":2067},"d1-over-http","D1 over HTTP",[144,2070,2071,2072,2075],{},"Use the ",[199,2073,2074],{},"d1-http"," driver to access a Cloudflare D1 database over HTTP when hosting on other platforms.",[339,2077,2079],{"className":341,"code":2078,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'sqlite',\n      driver: 'd1-http'\n    }\n  }\n})\n",[199,2080,2081,2093,2101,2109,2123,2135,2139,2143],{"__ignoreMap":344},[348,2082,2083,2085,2087,2089,2091],{"class":350,"line":351},[348,2084,355],{"class":354},[348,2086,358],{"class":354},[348,2088,362],{"class":361},[348,2090,366],{"class":365},[348,2092,370],{"class":369},[348,2094,2095,2097,2099],{"class":350,"line":373},[348,2096,377],{"class":376},[348,2098,380],{"class":369},[348,2100,383],{"class":369},[348,2102,2103,2105,2107],{"class":350,"line":386},[348,2104,389],{"class":376},[348,2106,380],{"class":369},[348,2108,383],{"class":369},[348,2110,2111,2113,2115,2117,2119,2121],{"class":350,"line":404},[348,2112,1711],{"class":376},[348,2114,380],{"class":369},[348,2116,394],{"class":369},[348,2118,504],{"class":397},[348,2120,600],{"class":369},[348,2122,632],{"class":369},[348,2124,2125,2127,2129,2131,2133],{"class":350,"line":410},[348,2126,1726],{"class":376},[348,2128,380],{"class":369},[348,2130,394],{"class":369},[348,2132,2074],{"class":397},[348,2134,401],{"class":369},[348,2136,2137],{"class":350,"line":655},[348,2138,1348],{"class":369},[348,2140,2141],{"class":350,"line":682},[348,2142,407],{"class":369},[348,2144,2145,2147],{"class":350,"line":702},[348,2146,413],{"class":369},[348,2148,416],{"class":365},[144,2150,2151],{},"This driver requires the following environment variables:",[2153,2154,2155,2168],"table",{},[2156,2157,2158],"thead",{},[2159,2160,2161,2165],"tr",{},[2162,2163,2164],"th",{},"Variable",[2162,2166,2167],{},"Description",[2169,2170,2171,2182,2192],"tbody",{},[2159,2172,2173,2179],{},[2174,2175,2176],"td",{},[199,2177,2178],{},"NUXT_HUB_CLOUDFLARE_ACCOUNT_ID",[2174,2180,2181],{},"Your Cloudflare account ID",[2159,2183,2184,2189],{},[2174,2185,2186],{},[199,2187,2188],{},"NUXT_HUB_CLOUDFLARE_API_TOKEN",[2174,2190,2191],{},"A Cloudflare API token with D1 permissions",[2159,2193,2194,2199],{},[2174,2195,2196],{},[199,2197,2198],{},"NUXT_HUB_CLOUDFLARE_DATABASE_ID",[2174,2200,2201],{},"The ID of your D1 database",[186,2203,2205,2206,2211,2212,2215],{"icon":2204},"i-lucide-info","You can find your Cloudflare account ID and create API tokens in the ",[148,2207,2210],{"href":2208,"rel":2209},"https://dash.cloudflare.com",[152],"Cloudflare dashboard",". The API token needs ",[199,2213,2214],{},"D1:Edit"," permissions.",[165,2217,2219],{"id":2218},"neon-serverless","Neon Serverless",[144,2221,2071,2222,2224,2225,2228],{},[199,2223,226],{}," driver to connect to ",[148,2226,236],{"href":234,"rel":2227},[152]," serverless PostgreSQL with HTTP protocol optimized for serverless environments.",[339,2230,2232],{"className":341,"code":2231,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql',\n      driver: 'neon-http'\n    }\n  }\n})\n",[199,2233,2234,2246,2254,2262,2276,2288,2292,2296],{"__ignoreMap":344},[348,2235,2236,2238,2240,2242,2244],{"class":350,"line":351},[348,2237,355],{"class":354},[348,2239,358],{"class":354},[348,2241,362],{"class":361},[348,2243,366],{"class":365},[348,2245,370],{"class":369},[348,2247,2248,2250,2252],{"class":350,"line":373},[348,2249,377],{"class":376},[348,2251,380],{"class":369},[348,2253,383],{"class":369},[348,2255,2256,2258,2260],{"class":350,"line":386},[348,2257,389],{"class":376},[348,2259,380],{"class":369},[348,2261,383],{"class":369},[348,2263,2264,2266,2268,2270,2272,2274],{"class":350,"line":404},[348,2265,1711],{"class":376},[348,2267,380],{"class":369},[348,2269,394],{"class":369},[348,2271,398],{"class":397},[348,2273,600],{"class":369},[348,2275,632],{"class":369},[348,2277,2278,2280,2282,2284,2286],{"class":350,"line":410},[348,2279,1726],{"class":376},[348,2281,380],{"class":369},[348,2283,394],{"class":369},[348,2285,226],{"class":397},[348,2287,401],{"class":369},[348,2289,2290],{"class":350,"line":655},[348,2291,1348],{"class":369},[348,2293,2294],{"class":350,"line":682},[348,2295,407],{"class":369},[348,2297,2298,2300],{"class":350,"line":702},[348,2299,413],{"class":369},[348,2301,416],{"class":365},[144,2303,2304],{},"Install the required dependency:",[182,2306],{"name":230},[144,2308,2309],{},"This driver requires the following environment variable:",[2153,2311,2312,2320],{},[2156,2313,2314],{},[2159,2315,2316,2318],{},[2162,2317,2164],{},[2162,2319,2167],{},[2169,2321,2322],{},[2159,2323,2324,2328],{},[2174,2325,2326],{},[199,2327,211],{},[2174,2329,2330,2331,2333,2334,1043],{},"Your Neon database connection string (or ",[199,2332,215],{}," / ",[199,2335,219],{},[186,2337,2338,2339,2344,2345,624],{"icon":2204},"You can find your Neon connection string in the ",[148,2340,2343],{"href":2341,"rel":2342},"https://console.neon.tech",[152],"Neon dashboard",". The connection string format is ",[199,2346,2347],{},"postgresql://user:password@hostname/database",[165,2349,2351],{"id":2350},"dockerkubernetes-deployments","Docker/Kubernetes Deployments",[144,2353,2354],{},"Build container images without database credentials by deferring environment resolution to runtime. Set the driver explicitly and disable automatic migrations during build and dev:",[173,2356,2357,2456,2554],{"sync":175},[177,2358,2359],{"icon":267,"label":268},[339,2360,2362],{"className":341,"code":2361,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'sqlite',\n      driver: 'libsql',\n      applyMigrationsDuringBuild: false,\n      applyMigrationsDuringDev: false\n    }\n  }\n})\n",[199,2363,2364,2376,2384,2392,2406,2420,2432,2442,2446,2450],{"__ignoreMap":344},[348,2365,2366,2368,2370,2372,2374],{"class":350,"line":351},[348,2367,355],{"class":354},[348,2369,358],{"class":354},[348,2371,362],{"class":361},[348,2373,366],{"class":365},[348,2375,370],{"class":369},[348,2377,2378,2380,2382],{"class":350,"line":373},[348,2379,377],{"class":376},[348,2381,380],{"class":369},[348,2383,383],{"class":369},[348,2385,2386,2388,2390],{"class":350,"line":386},[348,2387,389],{"class":376},[348,2389,380],{"class":369},[348,2391,383],{"class":369},[348,2393,2394,2396,2398,2400,2402,2404],{"class":350,"line":404},[348,2395,1711],{"class":376},[348,2397,380],{"class":369},[348,2399,394],{"class":369},[348,2401,504],{"class":397},[348,2403,600],{"class":369},[348,2405,632],{"class":369},[348,2407,2408,2410,2412,2414,2416,2418],{"class":350,"line":410},[348,2409,1726],{"class":376},[348,2411,380],{"class":369},[348,2413,394],{"class":369},[348,2415,282],{"class":397},[348,2417,600],{"class":369},[348,2419,632],{"class":369},[348,2421,2422,2425,2427,2430],{"class":350,"line":655},[348,2423,2424],{"class":376},"      applyMigrationsDuringBuild",[348,2426,380],{"class":369},[348,2428,2429],{"class":1037}," false",[348,2431,632],{"class":369},[348,2433,2434,2437,2439],{"class":350,"line":682},[348,2435,2436],{"class":376},"      applyMigrationsDuringDev",[348,2438,380],{"class":369},[348,2440,2441],{"class":1037}," false\n",[348,2443,2444],{"class":350,"line":702},[348,2445,1348],{"class":369},[348,2447,2448],{"class":350,"line":722},[348,2449,407],{"class":369},[348,2451,2452,2454],{"class":350,"line":749},[348,2453,413],{"class":369},[348,2455,416],{"class":365},[177,2457,2458],{"icon":179,"label":180},[339,2459,2461],{"className":341,"code":2460,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql',\n      driver: 'postgres-js', // or 'neon-http'\n      applyMigrationsDuringBuild: false,\n      applyMigrationsDuringDev: false\n    }\n  }\n})\n",[199,2462,2463,2475,2483,2491,2505,2522,2532,2540,2544,2548],{"__ignoreMap":344},[348,2464,2465,2467,2469,2471,2473],{"class":350,"line":351},[348,2466,355],{"class":354},[348,2468,358],{"class":354},[348,2470,362],{"class":361},[348,2472,366],{"class":365},[348,2474,370],{"class":369},[348,2476,2477,2479,2481],{"class":350,"line":373},[348,2478,377],{"class":376},[348,2480,380],{"class":369},[348,2482,383],{"class":369},[348,2484,2485,2487,2489],{"class":350,"line":386},[348,2486,389],{"class":376},[348,2488,380],{"class":369},[348,2490,383],{"class":369},[348,2492,2493,2495,2497,2499,2501,2503],{"class":350,"line":404},[348,2494,1711],{"class":376},[348,2496,380],{"class":369},[348,2498,394],{"class":369},[348,2500,398],{"class":397},[348,2502,600],{"class":369},[348,2504,632],{"class":369},[348,2506,2507,2509,2511,2513,2515,2517,2519],{"class":350,"line":410},[348,2508,1726],{"class":376},[348,2510,380],{"class":369},[348,2512,394],{"class":369},[348,2514,207],{"class":397},[348,2516,600],{"class":369},[348,2518,547],{"class":369},[348,2520,2521],{"class":1739}," // or 'neon-http'\n",[348,2523,2524,2526,2528,2530],{"class":350,"line":655},[348,2525,2424],{"class":376},[348,2527,380],{"class":369},[348,2529,2429],{"class":1037},[348,2531,632],{"class":369},[348,2533,2534,2536,2538],{"class":350,"line":682},[348,2535,2436],{"class":376},[348,2537,380],{"class":369},[348,2539,2441],{"class":1037},[348,2541,2542],{"class":350,"line":702},[348,2543,1348],{"class":369},[348,2545,2546],{"class":350,"line":722},[348,2547,407],{"class":369},[348,2549,2550,2552],{"class":350,"line":749},[348,2551,413],{"class":369},[348,2553,416],{"class":365},[177,2555,2556],{"icon":240,"label":241},[339,2557,2559],{"className":341,"code":2558,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'mysql',\n      driver: 'mysql2',\n      applyMigrationsDuringBuild: false,\n      applyMigrationsDuringDev: false\n    }\n  }\n})\n",[199,2560,2561,2573,2581,2589,2603,2617,2627,2635,2639,2643],{"__ignoreMap":344},[348,2562,2563,2565,2567,2569,2571],{"class":350,"line":351},[348,2564,355],{"class":354},[348,2566,358],{"class":354},[348,2568,362],{"class":361},[348,2570,366],{"class":365},[348,2572,370],{"class":369},[348,2574,2575,2577,2579],{"class":350,"line":373},[348,2576,377],{"class":376},[348,2578,380],{"class":369},[348,2580,383],{"class":369},[348,2582,2583,2585,2587],{"class":350,"line":386},[348,2584,389],{"class":376},[348,2586,380],{"class":369},[348,2588,383],{"class":369},[348,2590,2591,2593,2595,2597,2599,2601],{"class":350,"line":404},[348,2592,1711],{"class":376},[348,2594,380],{"class":369},[348,2596,394],{"class":369},[348,2598,454],{"class":397},[348,2600,600],{"class":369},[348,2602,632],{"class":369},[348,2604,2605,2607,2609,2611,2613,2615],{"class":350,"line":410},[348,2606,1726],{"class":376},[348,2608,380],{"class":369},[348,2610,394],{"class":369},[348,2612,255],{"class":397},[348,2614,600],{"class":369},[348,2616,632],{"class":369},[348,2618,2619,2621,2623,2625],{"class":350,"line":655},[348,2620,2424],{"class":376},[348,2622,380],{"class":369},[348,2624,2429],{"class":1037},[348,2626,632],{"class":369},[348,2628,2629,2631,2633],{"class":350,"line":682},[348,2630,2436],{"class":376},[348,2632,380],{"class":369},[348,2634,2441],{"class":1037},[348,2636,2637],{"class":350,"line":702},[348,2638,1348],{"class":369},[348,2640,2641],{"class":350,"line":722},[348,2642,407],{"class":369},[348,2644,2645,2647],{"class":350,"line":749},[348,2646,413],{"class":369},[348,2648,416],{"class":365},[144,2650,2651],{},"Set these environment variables at runtime:",[173,2653,2654,2695,2722],{"sync":175},[177,2655,2656],{"icon":267,"label":268},[2153,2657,2658,2666],{},[2156,2659,2660],{},[2159,2661,2662,2664],{},[2162,2663,2164],{},[2162,2665,2167],{},[2169,2667,2668,2683],{},[2159,2669,2670,2674],{},[2174,2671,2672],{},[199,2673,292],{},[2174,2675,2676,2677,2680,2681,624],{},"Connection URL for Turso or libSQL. Falls back to ",[199,2678,2679],{},"LIBSQL_URL",", then ",[199,2682,211],{},[2159,2684,2685,2689],{},[2174,2686,2687],{},[199,2688,296],{},[2174,2690,2691,2692,624],{},"Authentication token for remote databases. Falls back to ",[199,2693,2694],{},"LIBSQL_AUTH_TOKEN",[177,2696,2697],{"icon":179,"label":180},[2153,2698,2699,2707],{},[2156,2700,2701],{},[2159,2702,2703,2705],{},[2162,2704,2164],{},[2162,2706,2167],{},[2169,2708,2709],{},[2159,2710,2711,2715],{},[2174,2712,2713],{},[199,2714,215],{},[2174,2716,2717,2718,2680,2720,624],{},"Connection URL for PostgreSQL. Falls back to ",[199,2719,219],{},[199,2721,211],{},[177,2723,2724],{"icon":240,"label":241},[2153,2725,2726,2734],{},[2156,2727,2728],{},[2159,2729,2730,2732],{},[2162,2731,2164],{},[2162,2733,2167],{},[2169,2735,2736],{},[2159,2737,2738,2742],{},[2174,2739,2740],{},[199,2741,261],{},[2174,2743,2744,2745,624],{},"Connection URL for MySQL. Falls back to ",[199,2746,211],{},[308,2748,2749,2750,2753],{},"Apply migrations manually after deployment using ",[199,2751,2752],{},"npx nuxt db migrate"," or your CI/CD pipeline.",[165,2755,2757],{"id":2756},"read-replicas","Read Replicas",[144,2759,2760,2761,2768,2769,293,2771,2773],{},"NuxtHub supports read replicas using Drizzle ORM's ",[148,2762,2765],{"href":2763,"rel":2764},"https://orm.drizzle.team/docs/read-replicas",[152],[199,2766,2767],{},"withReplicas()"," feature for ",[199,2770,207],{},[199,2772,255],{}," drivers. When configured, read queries are automatically routed to replicas while write queries go to the primary database.",[144,2775,2776,2777,380],{},"Configure replicas in your ",[199,2778,314],{},[173,2780,2781,2896],{"sync":175},[177,2782,2783],{"icon":179,"label":180},[339,2784,2786],{"className":341,"code":2785,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql',\n      replicas: [\n        process.env.DATABASE_URL_REPLICA_1,\n        process.env.DATABASE_URL_REPLICA_2\n      ].filter(Boolean)\n    }\n  }\n})\n",[199,2787,2788,2800,2808,2816,2830,2840,2856,2869,2882,2886,2890],{"__ignoreMap":344},[348,2789,2790,2792,2794,2796,2798],{"class":350,"line":351},[348,2791,355],{"class":354},[348,2793,358],{"class":354},[348,2795,362],{"class":361},[348,2797,366],{"class":365},[348,2799,370],{"class":369},[348,2801,2802,2804,2806],{"class":350,"line":373},[348,2803,377],{"class":376},[348,2805,380],{"class":369},[348,2807,383],{"class":369},[348,2809,2810,2812,2814],{"class":350,"line":386},[348,2811,389],{"class":376},[348,2813,380],{"class":369},[348,2815,383],{"class":369},[348,2817,2818,2820,2822,2824,2826,2828],{"class":350,"line":404},[348,2819,1711],{"class":376},[348,2821,380],{"class":369},[348,2823,394],{"class":369},[348,2825,398],{"class":397},[348,2827,600],{"class":369},[348,2829,632],{"class":369},[348,2831,2832,2835,2837],{"class":350,"line":410},[348,2833,2834],{"class":376},"      replicas",[348,2836,380],{"class":369},[348,2838,2839],{"class":365}," [\n",[348,2841,2842,2845,2847,2849,2851,2854],{"class":350,"line":655},[348,2843,2844],{"class":365},"        process",[348,2846,624],{"class":369},[348,2848,1764],{"class":365},[348,2850,624],{"class":369},[348,2852,2853],{"class":365},"DATABASE_URL_REPLICA_1",[348,2855,632],{"class":369},[348,2857,2858,2860,2862,2864,2866],{"class":350,"line":682},[348,2859,2844],{"class":365},[348,2861,624],{"class":369},[348,2863,1764],{"class":365},[348,2865,624],{"class":369},[348,2867,2868],{"class":365},"DATABASE_URL_REPLICA_2\n",[348,2870,2871,2874,2876,2879],{"class":350,"line":702},[348,2872,2873],{"class":365},"      ]",[348,2875,624],{"class":369},[348,2877,2878],{"class":361},"filter",[348,2880,2881],{"class":365},"(Boolean)\n",[348,2883,2884],{"class":350,"line":722},[348,2885,1348],{"class":369},[348,2887,2888],{"class":350,"line":749},[348,2889,407],{"class":369},[348,2891,2892,2894],{"class":350,"line":1654},[348,2893,413],{"class":369},[348,2895,416],{"class":365},[177,2897,2898],{"icon":240,"label":241},[339,2899,2901],{"className":341,"code":2900,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'mysql',\n      replicas: [\n        process.env.DATABASE_URL_REPLICA_1,\n        process.env.DATABASE_URL_REPLICA_2\n      ].filter(Boolean)\n    }\n  }\n})\n",[199,2902,2903,2915,2923,2931,2945,2953,2967,2979,2989,2993,2997],{"__ignoreMap":344},[348,2904,2905,2907,2909,2911,2913],{"class":350,"line":351},[348,2906,355],{"class":354},[348,2908,358],{"class":354},[348,2910,362],{"class":361},[348,2912,366],{"class":365},[348,2914,370],{"class":369},[348,2916,2917,2919,2921],{"class":350,"line":373},[348,2918,377],{"class":376},[348,2920,380],{"class":369},[348,2922,383],{"class":369},[348,2924,2925,2927,2929],{"class":350,"line":386},[348,2926,389],{"class":376},[348,2928,380],{"class":369},[348,2930,383],{"class":369},[348,2932,2933,2935,2937,2939,2941,2943],{"class":350,"line":404},[348,2934,1711],{"class":376},[348,2936,380],{"class":369},[348,2938,394],{"class":369},[348,2940,454],{"class":397},[348,2942,600],{"class":369},[348,2944,632],{"class":369},[348,2946,2947,2949,2951],{"class":350,"line":410},[348,2948,2834],{"class":376},[348,2950,380],{"class":369},[348,2952,2839],{"class":365},[348,2954,2955,2957,2959,2961,2963,2965],{"class":350,"line":655},[348,2956,2844],{"class":365},[348,2958,624],{"class":369},[348,2960,1764],{"class":365},[348,2962,624],{"class":369},[348,2964,2853],{"class":365},[348,2966,632],{"class":369},[348,2968,2969,2971,2973,2975,2977],{"class":350,"line":682},[348,2970,2844],{"class":365},[348,2972,624],{"class":369},[348,2974,1764],{"class":365},[348,2976,624],{"class":369},[348,2978,2868],{"class":365},[348,2980,2981,2983,2985,2987],{"class":350,"line":702},[348,2982,2873],{"class":365},[348,2984,624],{"class":369},[348,2986,2878],{"class":361},[348,2988,2881],{"class":365},[348,2990,2991],{"class":350,"line":722},[348,2992,1348],{"class":369},[348,2994,2995],{"class":350,"line":749},[348,2996,407],{"class":369},[348,2998,2999,3001],{"class":350,"line":1654},[348,3000,413],{"class":369},[348,3002,416],{"class":365},[156,3004,3006],{"id":3005},"ai-agents","AI Agents",[144,3008,3009,3010,258,3013,3016],{},"If you work with an IDE that supports AI agents, you can add the following text in your ",[199,3011,3012],{},"Agents.md",[199,3014,3015],{},".cursor/rules"," file:",[339,3018,3022],{"className":3019,"code":3020,"language":3021,"meta":344,"style":344},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Agent Instructions\n\n/** ... your agent instructions ... */\n\n## Database\n\n- **Database Dialect**: The database dialect is set in the `nuxt.config.ts` file, within the `hub.db` option or `hub.db.dialect` property.\n- **Drizzle Config**: Don't generate the `drizzle.config.ts` file manually, it is generated automatically by NuxtHub.\n- **Generate Migrations**: Use `npx nuxt db generate` to automatically generate database migrations from schema changes\n- **Never Write Manual Migrations**: Do not manually create SQL migration files in the `server/db/migrations/` directory\n- **Workflow**:\n  1. Create or modify the database schema in `server/db/schema.ts` or any other schema file in the `server/db/schema/` directory\n  2. Run `npx nuxt db generate` to generate the migration\n  3. Run `npx nuxt db migrate` to apply the migration to the database, or run `npx nuxt dev` to apply the migration during development\n- **Access the database**: Use the `db` instance from `@nuxthub/db` (or `hub:db` for backwards compatibility) to query the database, it is a Drizzle ORM instance.\n","md",[199,3023,3024,3032,3036,3041,3045,3053,3057,3105,3129,3152,3176,3190,3217,3235,3262],{"__ignoreMap":344},[348,3025,3026,3029],{"class":350,"line":351},[348,3027,3028],{"class":369},"# ",[348,3030,3031],{"class":1192},"Agent Instructions\n",[348,3033,3034],{"class":350,"line":373},[348,3035,579],{"emptyLinePlaceholder":578},[348,3037,3038],{"class":350,"line":386},[348,3039,3040],{"class":365},"/** ... your agent instructions ... */\n",[348,3042,3043],{"class":350,"line":404},[348,3044,579],{"emptyLinePlaceholder":578},[348,3046,3047,3050],{"class":350,"line":410},[348,3048,3049],{"class":369},"## ",[348,3051,3052],{"class":1192},"Database\n",[348,3054,3055],{"class":350,"line":655},[348,3056,579],{"emptyLinePlaceholder":578},[348,3058,3059,3062,3066,3070,3073,3076,3078,3080,3082,3085,3087,3090,3092,3095,3097,3100,3102],{"class":350,"line":682},[348,3060,3061],{"class":369},"-",[348,3063,3065],{"class":3064},"sHepR"," **",[348,3067,3069],{"class":3068},"so75L","Database Dialect",[348,3071,3072],{"class":3064},"**",[348,3074,3075],{"class":365},": The database dialect is set in the ",[348,3077,1621],{"class":369},[348,3079,314],{"class":397},[348,3081,1621],{"class":369},[348,3083,3084],{"class":365}," file, within the ",[348,3086,1621],{"class":369},[348,3088,3089],{"class":397},"hub.db",[348,3091,1621],{"class":369},[348,3093,3094],{"class":365}," option or ",[348,3096,1621],{"class":369},[348,3098,3099],{"class":397},"hub.db.dialect",[348,3101,1621],{"class":369},[348,3103,3104],{"class":365}," property.\n",[348,3106,3107,3109,3111,3114,3116,3119,3121,3124,3126],{"class":350,"line":702},[348,3108,3061],{"class":369},[348,3110,3065],{"class":3064},[348,3112,3113],{"class":3068},"Drizzle Config",[348,3115,3072],{"class":3064},[348,3117,3118],{"class":365},": Don't generate the ",[348,3120,1621],{"class":369},[348,3122,3123],{"class":397},"drizzle.config.ts",[348,3125,1621],{"class":369},[348,3127,3128],{"class":365}," file manually, it is generated automatically by NuxtHub.\n",[348,3130,3131,3133,3135,3138,3140,3143,3145,3147,3149],{"class":350,"line":722},[348,3132,3061],{"class":369},[348,3134,3065],{"class":3064},[348,3136,3137],{"class":3068},"Generate Migrations",[348,3139,3072],{"class":3064},[348,3141,3142],{"class":365},": Use ",[348,3144,1621],{"class":369},[348,3146,1225],{"class":397},[348,3148,1621],{"class":369},[348,3150,3151],{"class":365}," to automatically generate database migrations from schema changes\n",[348,3153,3154,3156,3158,3161,3163,3166,3168,3171,3173],{"class":350,"line":749},[348,3155,3061],{"class":369},[348,3157,3065],{"class":3064},[348,3159,3160],{"class":3068},"Never Write Manual Migrations",[348,3162,3072],{"class":3064},[348,3164,3165],{"class":365},": Do not manually create SQL migration files in the ",[348,3167,1621],{"class":369},[348,3169,3170],{"class":397},"server/db/migrations/",[348,3172,1621],{"class":369},[348,3174,3175],{"class":365}," directory\n",[348,3177,3178,3180,3182,3185,3187],{"class":350,"line":1654},[348,3179,3061],{"class":369},[348,3181,3065],{"class":3064},[348,3183,3184],{"class":3068},"Workflow",[348,3186,3072],{"class":3064},[348,3188,3189],{"class":365},":\n",[348,3191,3193,3196,3199,3201,3203,3205,3208,3210,3213,3215],{"class":350,"line":3192},12,[348,3194,3195],{"class":369},"  1.",[348,3197,3198],{"class":365}," Create or modify the database schema in ",[348,3200,1621],{"class":369},[348,3202,531],{"class":397},[348,3204,1621],{"class":369},[348,3206,3207],{"class":365}," or any other schema file in the ",[348,3209,1621],{"class":369},[348,3211,3212],{"class":397},"server/db/schema/",[348,3214,1621],{"class":369},[348,3216,3175],{"class":365},[348,3218,3220,3223,3226,3228,3230,3232],{"class":350,"line":3219},13,[348,3221,3222],{"class":369},"  2.",[348,3224,3225],{"class":365}," Run ",[348,3227,1621],{"class":369},[348,3229,1225],{"class":397},[348,3231,1621],{"class":369},[348,3233,3234],{"class":365}," to generate the migration\n",[348,3236,3238,3241,3243,3245,3247,3249,3252,3254,3257,3259],{"class":350,"line":3237},14,[348,3239,3240],{"class":369},"  3.",[348,3242,3225],{"class":365},[348,3244,1621],{"class":369},[348,3246,2752],{"class":397},[348,3248,1621],{"class":369},[348,3250,3251],{"class":365}," to apply the migration to the database, or run ",[348,3253,1621],{"class":369},[348,3255,3256],{"class":397},"npx nuxt dev",[348,3258,1621],{"class":369},[348,3260,3261],{"class":365}," to apply the migration during development\n",[348,3263,3265,3267,3269,3272,3274,3277,3279,3281,3283,3285,3287,3289,3291,3294,3296,3299,3301],{"class":350,"line":3264},15,[348,3266,3061],{"class":369},[348,3268,3065],{"class":3064},[348,3270,3271],{"class":3068},"Access the database",[348,3273,3072],{"class":3064},[348,3275,3276],{"class":365},": Use the ",[348,3278,1621],{"class":369},[348,3280,332],{"class":397},[348,3282,1621],{"class":369},[348,3284,1215],{"class":365},[348,3286,1621],{"class":369},[348,3288,1218],{"class":397},[348,3290,1621],{"class":369},[348,3292,3293],{"class":365}," (or ",[348,3295,1621],{"class":369},[348,3297,3298],{"class":397},"hub:db",[348,3300,1621],{"class":369},[348,3302,3303],{"class":365}," for backwards compatibility) to query the database, it is a Drizzle ORM instance.\n",[156,3305,3307],{"id":3306},"migrating-from-v09","Migrating from v0.9",[1220,3309,3310,3313,3314,3317],{},[1170,3311,3312],{},"Breaking changes in NuxtHub v0.10:"," If you're upgrading from a previous version that used ",[199,3315,3316],{},"hubDatabase()",", follow this migration guide.",[165,3319,3321],{"id":3320},"configuration-changes","Configuration changes",[144,3323,3324,3325,3328,3329,3331],{},"The ",[199,3326,3327],{},"database"," option has been renamed to ",[199,3330,332],{}," and now accepts a SQL dialect instead of a boolean.",[339,3333,3337],{"className":3334,"code":3335,"filename":314,"language":3336,"meta":344,"style":344},"language-diff shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  hub: {\n-    database: true\n+    db: 'sqlite'\n  }\n})\n","diff",[199,3338,3339,3344,3349,3356,3364,3368],{"__ignoreMap":344},[348,3340,3341],{"class":350,"line":351},[348,3342,3343],{"class":365},"export default defineNuxtConfig({\n",[348,3345,3346],{"class":350,"line":373},[348,3347,3348],{"class":365},"  hub: {\n",[348,3350,3351,3353],{"class":350,"line":386},[348,3352,3061],{"class":369},[348,3354,3355],{"class":376},"    database: true\n",[348,3357,3358,3361],{"class":350,"line":404},[348,3359,3360],{"class":369},"+",[348,3362,3363],{"class":397},"    db: 'sqlite'\n",[348,3365,3366],{"class":350,"line":410},[348,3367,407],{"class":365},[348,3369,3370],{"class":350,"line":655},[348,3371,3372],{"class":365},"})\n",[144,3374,3375,3376,212,3378,293,3380,624],{},"Valid dialects are ",[199,3377,504],{},[199,3379,398],{},[199,3381,454],{},[165,3383,3385],{"id":3384},"directory-changes","Directory changes",[144,3387,3388,3389,3392,3393,380],{},"The database directory has been renamed from ",[199,3390,3391],{},"server/database/"," to ",[199,3394,3395],{},"server/db/",[339,3397,3399],{"className":3334,"code":3398,"language":3336,"meta":344,"style":344},"- server/database/schema.ts\n+ server/db/schema.ts\n\n- server/database/migrations/\n+ server/db/migrations/\n",[199,3400,3401,3408,3415,3419,3426],{"__ignoreMap":344},[348,3402,3403,3405],{"class":350,"line":351},[348,3404,3061],{"class":369},[348,3406,3407],{"class":376}," server/database/schema.ts\n",[348,3409,3410,3412],{"class":350,"line":373},[348,3411,3360],{"class":369},[348,3413,3414],{"class":397}," server/db/schema.ts\n",[348,3416,3417],{"class":350,"line":386},[348,3418,579],{"emptyLinePlaceholder":578},[348,3420,3421,3423],{"class":350,"line":404},[348,3422,3061],{"class":369},[348,3424,3425],{"class":376}," server/database/migrations/\n",[348,3427,3428,3430],{"class":350,"line":410},[348,3429,3360],{"class":369},[348,3431,3432],{"class":397}," server/db/migrations/\n",[144,3434,3435],{},"Make sure to move your schema and migration files to the new location.",[165,3437,3439],{"id":3438},"api-changes","API changes",[144,3441,3442,3443,3445],{},"The old ",[199,3444,3316],{}," function has been removed. You must now use Drizzle ORM.",[144,3447,3448],{},[1170,3449,3450],{},"Before:",[339,3452,3454],{"className":341,"code":3453,"language":343,"meta":344,"style":344},"const db = hubDatabase()\nconst result = await db.prepare('SELECT * FROM users').all()\n",[199,3455,3456,3472],{"__ignoreMap":344},[348,3457,3458,3461,3464,3466,3469],{"class":350,"line":351},[348,3459,3460],{"class":586},"const",[348,3462,3463],{"class":365}," db ",[348,3465,593],{"class":369},[348,3467,3468],{"class":361}," hubDatabase",[348,3470,3471],{"class":365},"()\n",[348,3473,3474,3476,3479,3481,3484,3486,3488,3491,3493,3495,3498,3500,3502,3504,3507],{"class":350,"line":373},[348,3475,3460],{"class":586},[348,3477,3478],{"class":365}," result ",[348,3480,593],{"class":369},[348,3482,3483],{"class":354}," await",[348,3485,1199],{"class":365},[348,3487,624],{"class":369},[348,3489,3490],{"class":361},"prepare",[348,3492,366],{"class":365},[348,3494,600],{"class":369},[348,3496,3497],{"class":397},"SELECT * FROM users",[348,3499,600],{"class":369},[348,3501,1043],{"class":365},[348,3503,624],{"class":369},[348,3505,3506],{"class":361},"all",[348,3508,3471],{"class":365},[144,3510,3511],{},[1170,3512,3513],{},"After:",[339,3515,3517],{"className":341,"code":3516,"language":343,"meta":344,"style":344},"const result = await db.select().from(tables.users)\n",[199,3518,3519],{"__ignoreMap":344},[348,3520,3521,3523,3525,3527,3529,3531,3533,3536,3538,3540,3543,3546,3548],{"class":350,"line":351},[348,3522,3460],{"class":586},[348,3524,3478],{"class":365},[348,3526,593],{"class":369},[348,3528,3483],{"class":354},[348,3530,1199],{"class":365},[348,3532,624],{"class":369},[348,3534,3535],{"class":361},"select",[348,3537,621],{"class":365},[348,3539,624],{"class":369},[348,3541,3542],{"class":361},"from",[348,3544,3545],{"class":365},"(tables",[348,3547,624],{"class":369},[348,3549,3550],{"class":365},"users)\n",[165,3552,3554],{"id":3553},"migration-files","Migration files",[144,3556,3557,3558,624],{},"Your existing SQL migration files continue to work! Just move them to ",[199,3559,3170],{},[3561,3562,3563],"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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}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 .sHepR, html code.shiki .sHepR{--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#89DDFF;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold}html pre.shiki code .so75L, html code.shiki .so75L{--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#F07178;--shiki-default-font-weight:bold;--shiki-dark:#F07178;--shiki-dark-font-weight:bold}",{"title":344,"searchDepth":373,"depth":373,"links":3565},[3566,3572,3573,3574,3581,3582],{"id":158,"depth":373,"text":159,"children":3567},[3568,3569,3570,3571],{"id":167,"depth":386,"text":168},{"id":322,"depth":386,"text":323},{"id":519,"depth":386,"text":520},{"id":1175,"depth":386,"text":1176},{"id":1229,"depth":373,"text":1230},{"id":1258,"depth":373,"text":1259},{"id":1669,"depth":373,"text":1670,"children":3575},[3576,3577,3578,3579,3580],{"id":1791,"depth":386,"text":1792},{"id":2067,"depth":386,"text":2068},{"id":2218,"depth":386,"text":2219},{"id":2350,"depth":386,"text":2351},{"id":2756,"depth":386,"text":2757},{"id":3005,"depth":373,"text":3006},{"id":3306,"depth":373,"text":3307,"children":3583},[3584,3585,3586,3587],{"id":3320,"depth":386,"text":3321},{"id":3384,"depth":386,"text":3385},{"id":3438,"depth":386,"text":3439},{"id":3553,"depth":386,"text":3554},"Setup your SQL database in Nuxt with Drizzle ORM, including installation, environment setup, and database connection.",null,{},{"title":40},{"title":139,"description":3588},"tudzPUBokEEzm2q7fcDSrPtIJQq-Nc3EJyrwWmYxRgY",[3595,3597],{"title":30,"path":31,"stem":32,"description":3596,"children":-1},"Configure and manage multiple environments for your NuxtHub application, including production, preview, staging, and local development.",{"title":42,"path":43,"stem":44,"description":3598,"children":-1},"Define and manage your database schema with Drizzle ORM in Nuxt, including tables, columns, relations, and type-safe models.",1773885578377]