[{"data":1,"prerenderedAt":3703},["ShallowReactive",2],{"navigation":3,"/docs/database":137,"/docs/database-surround":3698},[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":3692,"extension":3124,"links":3693,"meta":3694,"navigation":3695,"path":36,"seo":3696,"stem":37,"__hash__":3697},"docs/docs/2.database/1.index.md","Nuxt SQL Database",{"type":141,"value":142,"toc":3667},"minimark",[143,155,160,1227,1231,1245,1252,1256,1655,1663,1667,1670,1785,1789,1804,1878,1881,2051,2061,2065,2072,2145,2148,2198,2212,2216,2225,2298,2301,2303,2306,2332,2344,2348,2351,2645,2648,2743,2750,2754,2770,2775,2999,3003,3008,3100,3103,3106,3110,3120,3407,3411,3421,3425,3435,3476,3485,3489,3499,3536,3539,3543,3549,3554,3612,3617,3654,3658,3663],[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,[156,1253,1255],{"id":1254},"build-time-hooks","Build-time Hooks",[1257,1258,1259,1355,1452],"field-group",{},[1260,1261,1264,1267],"field",{"name":1262,"type":1263},"'hub:db:migrations:dirs'","(dirs: string[]) => void | Promise\u003Cvoid>",[144,1265,1266],{},"Add additional directories to scan for database migration files (.sql).",[339,1268,1270],{"className":341,"code":1269,"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,1271,1272,1284,1293,1319,1340,1345,1349],{"__ignoreMap":344},[348,1273,1274,1276,1278,1280,1282],{"class":350,"line":351},[348,1275,355],{"class":354},[348,1277,358],{"class":354},[348,1279,362],{"class":361},[348,1281,366],{"class":365},[348,1283,370],{"class":369},[348,1285,1286,1289,1291],{"class":350,"line":373},[348,1287,1288],{"class":376},"  hooks",[348,1290,380],{"class":369},[348,1292,383],{"class":369},[348,1294,1295,1298,1301,1303,1305,1308,1312,1314,1317],{"class":350,"line":386},[348,1296,1297],{"class":369},"    '",[348,1299,1300],{"class":376},"hub:db:migrations:dirs",[348,1302,600],{"class":369},[348,1304,380],{"class":369},[348,1306,1307],{"class":369}," (",[348,1309,1311],{"class":1310},"sHdIc","dirs",[348,1313,1043],{"class":369},[348,1315,1316],{"class":586}," =>",[348,1318,383],{"class":369},[348,1320,1321,1324,1326,1329,1331,1333,1336,1338],{"class":350,"line":404},[348,1322,1323],{"class":365},"      dirs",[348,1325,624],{"class":369},[348,1327,1328],{"class":361},"push",[348,1330,366],{"class":376},[348,1332,600],{"class":369},[348,1334,1335],{"class":397},"my-module/db/migrations",[348,1337,600],{"class":369},[348,1339,416],{"class":376},[348,1341,1342],{"class":350,"line":410},[348,1343,1344],{"class":369},"    }\n",[348,1346,1347],{"class":350,"line":655},[348,1348,407],{"class":369},[348,1350,1351,1353],{"class":350,"line":682},[348,1352,413],{"class":369},[348,1354,416],{"class":365},[1260,1356,1359,1366],{"name":1357,"type":1358},"'hub:db:queries:paths'","(queries: string[], dialect: string) => void | Promise\u003Cvoid>",[144,1360,1361,1362,1365],{},"Add queries that are not tracked in the ",[199,1363,1364],{},"_hub_migrations"," table which are applied after the database migrations complete.",[339,1367,1369],{"className":341,"code":1368,"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,1370,1371,1383,1391,1418,1438,1442,1446],{"__ignoreMap":344},[348,1372,1373,1375,1377,1379,1381],{"class":350,"line":351},[348,1374,355],{"class":354},[348,1376,358],{"class":354},[348,1378,362],{"class":361},[348,1380,366],{"class":365},[348,1382,370],{"class":369},[348,1384,1385,1387,1389],{"class":350,"line":373},[348,1386,1288],{"class":376},[348,1388,380],{"class":369},[348,1390,383],{"class":369},[348,1392,1393,1395,1398,1400,1402,1404,1407,1409,1412,1414,1416],{"class":350,"line":386},[348,1394,1297],{"class":369},[348,1396,1397],{"class":376},"hub:db:queries:paths",[348,1399,600],{"class":369},[348,1401,380],{"class":369},[348,1403,1307],{"class":369},[348,1405,1406],{"class":1310},"queries",[348,1408,547],{"class":369},[348,1410,1411],{"class":1310}," dialect",[348,1413,1043],{"class":369},[348,1415,1316],{"class":586},[348,1417,383],{"class":369},[348,1419,1420,1423,1425,1427,1429,1431,1434,1436],{"class":350,"line":404},[348,1421,1422],{"class":365},"      queries",[348,1424,624],{"class":369},[348,1426,1328],{"class":361},[348,1428,366],{"class":376},[348,1430,600],{"class":369},[348,1432,1433],{"class":397},"my-module/db/queries",[348,1435,600],{"class":369},[348,1437,416],{"class":376},[348,1439,1440],{"class":350,"line":410},[348,1441,1344],{"class":369},[348,1443,1444],{"class":350,"line":655},[348,1445,407],{"class":369},[348,1447,1448,1450],{"class":350,"line":682},[348,1449,413],{"class":369},[348,1451,416],{"class":365},[1260,1453,1456,1459],{"name":1454,"type":1455},"'hub:db:schema:extend'","({ paths: string[], dialect: string }) => void | Promise\u003Cvoid>",[144,1457,1458],{},"Extend the database schema with additional files.",[339,1460,1463],{"className":341,"code":1461,"filename":1462,"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,1464,1465,1490,1494,1506,1524,1557,1561,1599,1637,1644,1648],{"__ignoreMap":344},[348,1466,1467,1469,1471,1474,1476,1479,1481,1483,1485,1488],{"class":350,"line":351},[348,1468,538],{"class":354},[348,1470,541],{"class":369},[348,1472,1473],{"class":365}," createResolver",[348,1475,547],{"class":369},[348,1477,1478],{"class":365}," defineNuxtModule",[348,1480,563],{"class":369},[348,1482,566],{"class":354},[348,1484,394],{"class":369},[348,1486,1487],{"class":397},"@nuxt/kit",[348,1489,401],{"class":369},[348,1491,1492],{"class":350,"line":373},[348,1493,579],{"emptyLinePlaceholder":578},[348,1495,1496,1498,1500,1502,1504],{"class":350,"line":386},[348,1497,355],{"class":354},[348,1499,358],{"class":354},[348,1501,1478],{"class":361},[348,1503,366],{"class":365},[348,1505,370],{"class":369},[348,1507,1508,1511,1513,1516,1518,1520,1522],{"class":350,"line":404},[348,1509,1510],{"class":376},"  setup",[348,1512,366],{"class":369},[348,1514,1515],{"class":1310},"options",[348,1517,547],{"class":369},[348,1519,1196],{"class":1310},[348,1521,1043],{"class":369},[348,1523,383],{"class":369},[348,1525,1526,1529,1531,1534,1536,1539,1541,1543,1545,1547,1550,1552,1555],{"class":350,"line":410},[348,1527,1528],{"class":586},"    const",[348,1530,541],{"class":369},[348,1532,1533],{"class":365}," resolve",[348,1535,563],{"class":369},[348,1537,1538],{"class":369}," =",[348,1540,1473],{"class":361},[348,1542,366],{"class":376},[348,1544,538],{"class":354},[348,1546,624],{"class":369},[348,1548,1549],{"class":365},"meta",[348,1551,624],{"class":369},[348,1553,1554],{"class":365},"url",[348,1556,416],{"class":376},[348,1558,1559],{"class":350,"line":655},[348,1560,579],{"emptyLinePlaceholder":578},[348,1562,1563,1566,1568,1571,1573,1575,1578,1580,1582,1585,1588,1590,1592,1595,1597],{"class":350,"line":682},[348,1564,1565],{"class":365},"    nuxt",[348,1567,624],{"class":369},[348,1569,1570],{"class":361},"hook",[348,1572,366],{"class":376},[348,1574,600],{"class":369},[348,1576,1577],{"class":397},"hub:db:schema:extend",[348,1579,600],{"class":369},[348,1581,547],{"class":369},[348,1583,1584],{"class":369}," ({",[348,1586,1587],{"class":1310}," paths",[348,1589,547],{"class":369},[348,1591,1411],{"class":1310},[348,1593,1594],{"class":369}," })",[348,1596,1316],{"class":586},[348,1598,383],{"class":369},[348,1600,1601,1604,1606,1608,1610,1613,1615,1618,1621,1624,1627,1629,1632,1634],{"class":350,"line":702},[348,1602,1603],{"class":365},"      paths",[348,1605,624],{"class":369},[348,1607,1328],{"class":361},[348,1609,366],{"class":376},[348,1611,1612],{"class":361},"resolve",[348,1614,366],{"class":376},[348,1616,1617],{"class":369},"`",[348,1619,1620],{"class":397},"./db/schema/pages.",[348,1622,1623],{"class":369},"${",[348,1625,1626],{"class":365},"dialect",[348,1628,413],{"class":369},[348,1630,1631],{"class":397},".ts",[348,1633,1617],{"class":369},[348,1635,1636],{"class":376},"))\n",[348,1638,1639,1642],{"class":350,"line":722},[348,1640,1641],{"class":369},"    }",[348,1643,416],{"class":376},[348,1645,1646],{"class":350,"line":749},[348,1647,407],{"class":369},[348,1649,1651,1653],{"class":350,"line":1650},11,[348,1652,413],{"class":369},[348,1654,416],{"class":365},[1656,1657,1659,1660,624],"note",{"to":1658},"https://nuxt.com/docs/4.x/guide/going-further/hooks#nuxt-hooks-build-time","Learn more about Nuxt server hooks on the ",[1170,1661,1662],{},"Nuxt documentation",[156,1664,1666],{"id":1665},"advanced-configuration","Advanced configuration",[144,1668,1669],{},"For advanced use cases, you can explicitly configure the database connection:",[339,1671,1673],{"className":341,"code":1672,"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,1674,1675,1687,1695,1703,1718,1737,1746,1766,1771,1775,1779],{"__ignoreMap":344},[348,1676,1677,1679,1681,1683,1685],{"class":350,"line":351},[348,1678,355],{"class":354},[348,1680,358],{"class":354},[348,1682,362],{"class":361},[348,1684,366],{"class":365},[348,1686,370],{"class":369},[348,1688,1689,1691,1693],{"class":350,"line":373},[348,1690,377],{"class":376},[348,1692,380],{"class":369},[348,1694,383],{"class":369},[348,1696,1697,1699,1701],{"class":350,"line":386},[348,1698,389],{"class":376},[348,1700,380],{"class":369},[348,1702,383],{"class":369},[348,1704,1705,1708,1710,1712,1714,1716],{"class":350,"line":404},[348,1706,1707],{"class":376},"      dialect",[348,1709,380],{"class":369},[348,1711,394],{"class":369},[348,1713,398],{"class":397},[348,1715,600],{"class":369},[348,1717,632],{"class":369},[348,1719,1720,1723,1725,1727,1729,1731,1733],{"class":350,"line":410},[348,1721,1722],{"class":376},"      driver",[348,1724,380],{"class":369},[348,1726,394],{"class":369},[348,1728,207],{"class":397},[348,1730,600],{"class":369},[348,1732,547],{"class":369},[348,1734,1736],{"class":1735},"sHwdD"," // Optional: explicitly choose driver\n",[348,1738,1739,1742,1744],{"class":350,"line":655},[348,1740,1741],{"class":376},"      connection",[348,1743,380],{"class":369},[348,1745,383],{"class":369},[348,1747,1748,1751,1753,1756,1758,1761,1763],{"class":350,"line":682},[348,1749,1750],{"class":376},"        connectionString",[348,1752,380],{"class":369},[348,1754,1755],{"class":365}," process",[348,1757,624],{"class":369},[348,1759,1760],{"class":365},"env",[348,1762,624],{"class":369},[348,1764,1765],{"class":365},"DATABASE_URL\n",[348,1767,1768],{"class":350,"line":702},[348,1769,1770],{"class":369},"      }\n",[348,1772,1773],{"class":350,"line":722},[348,1774,1344],{"class":369},[348,1776,1777],{"class":350,"line":749},[348,1778,407],{"class":369},[348,1780,1781,1783],{"class":350,"line":1650},[348,1782,413],{"class":369},[348,1784,416],{"class":365},[165,1786,1788],{"id":1787},"column-casing","Column casing",[144,1790,1791,1792,1795,1796,1799,1800,1803],{},"Database model names often use ",[199,1793,1794],{},"snake_case"," conventions, while in TypeScript, it is common to use ",[199,1797,1798],{},"camelCase"," for naming models. To address this, you can use the ",[199,1801,1802],{},"casing"," option to automatically map camelCase JavaScript keys to snake_case in the database:",[339,1805,1807],{"className":341,"code":1806,"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,1808,1809,1821,1829,1837,1851,1864,1868,1872],{"__ignoreMap":344},[348,1810,1811,1813,1815,1817,1819],{"class":350,"line":351},[348,1812,355],{"class":354},[348,1814,358],{"class":354},[348,1816,362],{"class":361},[348,1818,366],{"class":365},[348,1820,370],{"class":369},[348,1822,1823,1825,1827],{"class":350,"line":373},[348,1824,377],{"class":376},[348,1826,380],{"class":369},[348,1828,383],{"class":369},[348,1830,1831,1833,1835],{"class":350,"line":386},[348,1832,389],{"class":376},[348,1834,380],{"class":369},[348,1836,383],{"class":369},[348,1838,1839,1841,1843,1845,1847,1849],{"class":350,"line":404},[348,1840,1707],{"class":376},[348,1842,380],{"class":369},[348,1844,394],{"class":369},[348,1846,398],{"class":397},[348,1848,600],{"class":369},[348,1850,632],{"class":369},[348,1852,1853,1856,1858,1860,1862],{"class":350,"line":410},[348,1854,1855],{"class":376},"      casing",[348,1857,380],{"class":369},[348,1859,394],{"class":369},[348,1861,1794],{"class":397},[348,1863,401],{"class":369},[348,1865,1866],{"class":350,"line":655},[348,1867,1344],{"class":369},[348,1869,1870],{"class":350,"line":682},[348,1871,407],{"class":369},[348,1873,1874,1876],{"class":350,"line":702},[348,1875,413],{"class":369},[348,1877,416],{"class":365},[144,1879,1880],{},"This allows you to use camelCase in your TypeScript schema while Drizzle automatically maps them to snake_case in the database:",[339,1882,1884],{"className":341,"code":1883,"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,1885,1886,1916,1920,1944,1962,1984,2006,2045],{"__ignoreMap":344},[348,1887,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912,1914],{"class":350,"line":351},[348,1889,538],{"class":354},[348,1891,541],{"class":369},[348,1893,544],{"class":365},[348,1895,547],{"class":369},[348,1897,550],{"class":365},[348,1899,547],{"class":369},[348,1901,555],{"class":365},[348,1903,547],{"class":369},[348,1905,560],{"class":365},[348,1907,563],{"class":369},[348,1909,566],{"class":354},[348,1911,394],{"class":369},[348,1913,571],{"class":397},[348,1915,401],{"class":369},[348,1917,1918],{"class":350,"line":373},[348,1919,579],{"emptyLinePlaceholder":578},[348,1921,1922,1924,1926,1928,1930,1932,1934,1936,1938,1940,1942],{"class":350,"line":386},[348,1923,355],{"class":354},[348,1925,587],{"class":586},[348,1927,590],{"class":365},[348,1929,593],{"class":369},[348,1931,544],{"class":361},[348,1933,366],{"class":365},[348,1935,600],{"class":369},[348,1937,603],{"class":397},[348,1939,600],{"class":369},[348,1941,547],{"class":369},[348,1943,383],{"class":369},[348,1945,1946,1948,1950,1952,1954,1956,1958,1960],{"class":350,"line":404},[348,1947,614],{"class":376},[348,1949,380],{"class":369},[348,1951,555],{"class":361},[348,1953,621],{"class":365},[348,1955,624],{"class":369},[348,1957,627],{"class":361},[348,1959,621],{"class":365},[348,1961,632],{"class":369},[348,1963,1964,1967,1969,1971,1973,1975,1977,1979,1981],{"class":350,"line":410},[348,1965,1966],{"class":376},"  firstName",[348,1968,380],{"class":369},[348,1970,550],{"class":361},[348,1972,621],{"class":365},[348,1974,624],{"class":369},[348,1976,648],{"class":361},[348,1978,621],{"class":365},[348,1980,547],{"class":369},[348,1982,1983],{"class":1735}," // Maps to first_name in the database\n",[348,1985,1986,1989,1991,1993,1995,1997,1999,2001,2003],{"class":350,"line":655},[348,1987,1988],{"class":376},"  lastName",[348,1990,380],{"class":369},[348,1992,550],{"class":361},[348,1994,621],{"class":365},[348,1996,624],{"class":369},[348,1998,648],{"class":361},[348,2000,621],{"class":365},[348,2002,547],{"class":369},[348,2004,2005],{"class":1735},"  // Maps to last_name in the database\n",[348,2007,2008,2010,2012,2014,2016,2018,2020,2022,2024,2027,2029,2032,2034,2037,2039,2042],{"class":350,"line":682},[348,2009,725],{"class":376},[348,2011,380],{"class":369},[348,2013,560],{"class":361},[348,2015,621],{"class":365},[348,2017,624],{"class":369},[348,2019,648],{"class":361},[348,2021,621],{"class":365},[348,2023,624],{"class":369},[348,2025,2026],{"class":361},"default",[348,2028,366],{"class":365},[348,2030,2031],{"class":361},"sql",[348,2033,1617],{"class":369},[348,2035,2036],{"class":397},"CURRENT_TIMESTAMP",[348,2038,1617],{"class":369},[348,2040,2041],{"class":365},") ",[348,2043,2044],{"class":1735},"// Maps to created_at\n",[348,2046,2047,2049],{"class":350,"line":702},[348,2048,413],{"class":369},[348,2050,416],{"class":365},[186,2052,2055,2056,2060],{"to":2053,":external":2054},"https://orm.drizzle.team/docs/sql-schema-declaration#camel-and-snake-casing","true","Learn more about ",[148,2057,2059],{"href":2053,"rel":2058},[152],"camel and snake casing"," in Drizzle ORM.",[165,2062,2064],{"id":2063},"d1-over-http","D1 over HTTP",[144,2066,2067,2068,2071],{},"Use the ",[199,2069,2070],{},"d1-http"," driver to access a Cloudflare D1 database over HTTP when hosting on other platforms.",[339,2073,2075],{"className":341,"code":2074,"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,2076,2077,2089,2097,2105,2119,2131,2135,2139],{"__ignoreMap":344},[348,2078,2079,2081,2083,2085,2087],{"class":350,"line":351},[348,2080,355],{"class":354},[348,2082,358],{"class":354},[348,2084,362],{"class":361},[348,2086,366],{"class":365},[348,2088,370],{"class":369},[348,2090,2091,2093,2095],{"class":350,"line":373},[348,2092,377],{"class":376},[348,2094,380],{"class":369},[348,2096,383],{"class":369},[348,2098,2099,2101,2103],{"class":350,"line":386},[348,2100,389],{"class":376},[348,2102,380],{"class":369},[348,2104,383],{"class":369},[348,2106,2107,2109,2111,2113,2115,2117],{"class":350,"line":404},[348,2108,1707],{"class":376},[348,2110,380],{"class":369},[348,2112,394],{"class":369},[348,2114,504],{"class":397},[348,2116,600],{"class":369},[348,2118,632],{"class":369},[348,2120,2121,2123,2125,2127,2129],{"class":350,"line":410},[348,2122,1722],{"class":376},[348,2124,380],{"class":369},[348,2126,394],{"class":369},[348,2128,2070],{"class":397},[348,2130,401],{"class":369},[348,2132,2133],{"class":350,"line":655},[348,2134,1344],{"class":369},[348,2136,2137],{"class":350,"line":682},[348,2138,407],{"class":369},[348,2140,2141,2143],{"class":350,"line":702},[348,2142,413],{"class":369},[348,2144,416],{"class":365},[144,2146,2147],{},"This driver requires the following environment variables:",[2149,2150,2151,2164],"table",{},[2152,2153,2154],"thead",{},[2155,2156,2157,2161],"tr",{},[2158,2159,2160],"th",{},"Variable",[2158,2162,2163],{},"Description",[2165,2166,2167,2178,2188],"tbody",{},[2155,2168,2169,2175],{},[2170,2171,2172],"td",{},[199,2173,2174],{},"NUXT_HUB_CLOUDFLARE_ACCOUNT_ID",[2170,2176,2177],{},"Your Cloudflare account ID",[2155,2179,2180,2185],{},[2170,2181,2182],{},[199,2183,2184],{},"NUXT_HUB_CLOUDFLARE_API_TOKEN",[2170,2186,2187],{},"A Cloudflare API token with D1 permissions",[2155,2189,2190,2195],{},[2170,2191,2192],{},[199,2193,2194],{},"NUXT_HUB_CLOUDFLARE_DATABASE_ID",[2170,2196,2197],{},"The ID of your D1 database",[186,2199,2201,2202,2207,2208,2211],{"icon":2200},"i-lucide-info","You can find your Cloudflare account ID and create API tokens in the ",[148,2203,2206],{"href":2204,"rel":2205},"https://dash.cloudflare.com",[152],"Cloudflare dashboard",". The API token needs ",[199,2209,2210],{},"D1:Edit"," permissions.",[165,2213,2215],{"id":2214},"neon-serverless","Neon Serverless",[144,2217,2067,2218,2220,2221,2224],{},[199,2219,226],{}," driver to connect to ",[148,2222,236],{"href":234,"rel":2223},[152]," serverless PostgreSQL with HTTP protocol optimized for serverless environments.",[339,2226,2228],{"className":341,"code":2227,"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,2229,2230,2242,2250,2258,2272,2284,2288,2292],{"__ignoreMap":344},[348,2231,2232,2234,2236,2238,2240],{"class":350,"line":351},[348,2233,355],{"class":354},[348,2235,358],{"class":354},[348,2237,362],{"class":361},[348,2239,366],{"class":365},[348,2241,370],{"class":369},[348,2243,2244,2246,2248],{"class":350,"line":373},[348,2245,377],{"class":376},[348,2247,380],{"class":369},[348,2249,383],{"class":369},[348,2251,2252,2254,2256],{"class":350,"line":386},[348,2253,389],{"class":376},[348,2255,380],{"class":369},[348,2257,383],{"class":369},[348,2259,2260,2262,2264,2266,2268,2270],{"class":350,"line":404},[348,2261,1707],{"class":376},[348,2263,380],{"class":369},[348,2265,394],{"class":369},[348,2267,398],{"class":397},[348,2269,600],{"class":369},[348,2271,632],{"class":369},[348,2273,2274,2276,2278,2280,2282],{"class":350,"line":410},[348,2275,1722],{"class":376},[348,2277,380],{"class":369},[348,2279,394],{"class":369},[348,2281,226],{"class":397},[348,2283,401],{"class":369},[348,2285,2286],{"class":350,"line":655},[348,2287,1344],{"class":369},[348,2289,2290],{"class":350,"line":682},[348,2291,407],{"class":369},[348,2293,2294,2296],{"class":350,"line":702},[348,2295,413],{"class":369},[348,2297,416],{"class":365},[144,2299,2300],{},"Install the required dependency:",[182,2302],{"name":230},[144,2304,2305],{},"This driver requires the following environment variable:",[2149,2307,2308,2316],{},[2152,2309,2310],{},[2155,2311,2312,2314],{},[2158,2313,2160],{},[2158,2315,2163],{},[2165,2317,2318],{},[2155,2319,2320,2324],{},[2170,2321,2322],{},[199,2323,211],{},[2170,2325,2326,2327,2329,2330,1043],{},"Your Neon database connection string (or ",[199,2328,215],{}," / ",[199,2331,219],{},[186,2333,2334,2335,2340,2341,624],{"icon":2200},"You can find your Neon connection string in the ",[148,2336,2339],{"href":2337,"rel":2338},"https://console.neon.tech",[152],"Neon dashboard",". The connection string format is ",[199,2342,2343],{},"postgresql://user:password@hostname/database",[165,2345,2347],{"id":2346},"dockerkubernetes-deployments","Docker/Kubernetes Deployments",[144,2349,2350],{},"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,2352,2353,2452,2550],{"sync":175},[177,2354,2355],{"icon":267,"label":268},[339,2356,2358],{"className":341,"code":2357,"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,2359,2360,2372,2380,2388,2402,2416,2428,2438,2442,2446],{"__ignoreMap":344},[348,2361,2362,2364,2366,2368,2370],{"class":350,"line":351},[348,2363,355],{"class":354},[348,2365,358],{"class":354},[348,2367,362],{"class":361},[348,2369,366],{"class":365},[348,2371,370],{"class":369},[348,2373,2374,2376,2378],{"class":350,"line":373},[348,2375,377],{"class":376},[348,2377,380],{"class":369},[348,2379,383],{"class":369},[348,2381,2382,2384,2386],{"class":350,"line":386},[348,2383,389],{"class":376},[348,2385,380],{"class":369},[348,2387,383],{"class":369},[348,2389,2390,2392,2394,2396,2398,2400],{"class":350,"line":404},[348,2391,1707],{"class":376},[348,2393,380],{"class":369},[348,2395,394],{"class":369},[348,2397,504],{"class":397},[348,2399,600],{"class":369},[348,2401,632],{"class":369},[348,2403,2404,2406,2408,2410,2412,2414],{"class":350,"line":410},[348,2405,1722],{"class":376},[348,2407,380],{"class":369},[348,2409,394],{"class":369},[348,2411,282],{"class":397},[348,2413,600],{"class":369},[348,2415,632],{"class":369},[348,2417,2418,2421,2423,2426],{"class":350,"line":655},[348,2419,2420],{"class":376},"      applyMigrationsDuringBuild",[348,2422,380],{"class":369},[348,2424,2425],{"class":1037}," false",[348,2427,632],{"class":369},[348,2429,2430,2433,2435],{"class":350,"line":682},[348,2431,2432],{"class":376},"      applyMigrationsDuringDev",[348,2434,380],{"class":369},[348,2436,2437],{"class":1037}," false\n",[348,2439,2440],{"class":350,"line":702},[348,2441,1344],{"class":369},[348,2443,2444],{"class":350,"line":722},[348,2445,407],{"class":369},[348,2447,2448,2450],{"class":350,"line":749},[348,2449,413],{"class":369},[348,2451,416],{"class":365},[177,2453,2454],{"icon":179,"label":180},[339,2455,2457],{"className":341,"code":2456,"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,2458,2459,2471,2479,2487,2501,2518,2528,2536,2540,2544],{"__ignoreMap":344},[348,2460,2461,2463,2465,2467,2469],{"class":350,"line":351},[348,2462,355],{"class":354},[348,2464,358],{"class":354},[348,2466,362],{"class":361},[348,2468,366],{"class":365},[348,2470,370],{"class":369},[348,2472,2473,2475,2477],{"class":350,"line":373},[348,2474,377],{"class":376},[348,2476,380],{"class":369},[348,2478,383],{"class":369},[348,2480,2481,2483,2485],{"class":350,"line":386},[348,2482,389],{"class":376},[348,2484,380],{"class":369},[348,2486,383],{"class":369},[348,2488,2489,2491,2493,2495,2497,2499],{"class":350,"line":404},[348,2490,1707],{"class":376},[348,2492,380],{"class":369},[348,2494,394],{"class":369},[348,2496,398],{"class":397},[348,2498,600],{"class":369},[348,2500,632],{"class":369},[348,2502,2503,2505,2507,2509,2511,2513,2515],{"class":350,"line":410},[348,2504,1722],{"class":376},[348,2506,380],{"class":369},[348,2508,394],{"class":369},[348,2510,207],{"class":397},[348,2512,600],{"class":369},[348,2514,547],{"class":369},[348,2516,2517],{"class":1735}," // or 'neon-http'\n",[348,2519,2520,2522,2524,2526],{"class":350,"line":655},[348,2521,2420],{"class":376},[348,2523,380],{"class":369},[348,2525,2425],{"class":1037},[348,2527,632],{"class":369},[348,2529,2530,2532,2534],{"class":350,"line":682},[348,2531,2432],{"class":376},[348,2533,380],{"class":369},[348,2535,2437],{"class":1037},[348,2537,2538],{"class":350,"line":702},[348,2539,1344],{"class":369},[348,2541,2542],{"class":350,"line":722},[348,2543,407],{"class":369},[348,2545,2546,2548],{"class":350,"line":749},[348,2547,413],{"class":369},[348,2549,416],{"class":365},[177,2551,2552],{"icon":240,"label":241},[339,2553,2555],{"className":341,"code":2554,"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,2556,2557,2569,2577,2585,2599,2613,2623,2631,2635,2639],{"__ignoreMap":344},[348,2558,2559,2561,2563,2565,2567],{"class":350,"line":351},[348,2560,355],{"class":354},[348,2562,358],{"class":354},[348,2564,362],{"class":361},[348,2566,366],{"class":365},[348,2568,370],{"class":369},[348,2570,2571,2573,2575],{"class":350,"line":373},[348,2572,377],{"class":376},[348,2574,380],{"class":369},[348,2576,383],{"class":369},[348,2578,2579,2581,2583],{"class":350,"line":386},[348,2580,389],{"class":376},[348,2582,380],{"class":369},[348,2584,383],{"class":369},[348,2586,2587,2589,2591,2593,2595,2597],{"class":350,"line":404},[348,2588,1707],{"class":376},[348,2590,380],{"class":369},[348,2592,394],{"class":369},[348,2594,454],{"class":397},[348,2596,600],{"class":369},[348,2598,632],{"class":369},[348,2600,2601,2603,2605,2607,2609,2611],{"class":350,"line":410},[348,2602,1722],{"class":376},[348,2604,380],{"class":369},[348,2606,394],{"class":369},[348,2608,255],{"class":397},[348,2610,600],{"class":369},[348,2612,632],{"class":369},[348,2614,2615,2617,2619,2621],{"class":350,"line":655},[348,2616,2420],{"class":376},[348,2618,380],{"class":369},[348,2620,2425],{"class":1037},[348,2622,632],{"class":369},[348,2624,2625,2627,2629],{"class":350,"line":682},[348,2626,2432],{"class":376},[348,2628,380],{"class":369},[348,2630,2437],{"class":1037},[348,2632,2633],{"class":350,"line":702},[348,2634,1344],{"class":369},[348,2636,2637],{"class":350,"line":722},[348,2638,407],{"class":369},[348,2640,2641,2643],{"class":350,"line":749},[348,2642,413],{"class":369},[348,2644,416],{"class":365},[144,2646,2647],{},"Set these environment variables at runtime:",[173,2649,2650,2691,2718],{"sync":175},[177,2651,2652],{"icon":267,"label":268},[2149,2653,2654,2662],{},[2152,2655,2656],{},[2155,2657,2658,2660],{},[2158,2659,2160],{},[2158,2661,2163],{},[2165,2663,2664,2679],{},[2155,2665,2666,2670],{},[2170,2667,2668],{},[199,2669,292],{},[2170,2671,2672,2673,2676,2677,624],{},"Connection URL for Turso or libSQL. Falls back to ",[199,2674,2675],{},"LIBSQL_URL",", then ",[199,2678,211],{},[2155,2680,2681,2685],{},[2170,2682,2683],{},[199,2684,296],{},[2170,2686,2687,2688,624],{},"Authentication token for remote databases. Falls back to ",[199,2689,2690],{},"LIBSQL_AUTH_TOKEN",[177,2692,2693],{"icon":179,"label":180},[2149,2694,2695,2703],{},[2152,2696,2697],{},[2155,2698,2699,2701],{},[2158,2700,2160],{},[2158,2702,2163],{},[2165,2704,2705],{},[2155,2706,2707,2711],{},[2170,2708,2709],{},[199,2710,215],{},[2170,2712,2713,2714,2676,2716,624],{},"Connection URL for PostgreSQL. Falls back to ",[199,2715,219],{},[199,2717,211],{},[177,2719,2720],{"icon":240,"label":241},[2149,2721,2722,2730],{},[2152,2723,2724],{},[2155,2725,2726,2728],{},[2158,2727,2160],{},[2158,2729,2163],{},[2165,2731,2732],{},[2155,2733,2734,2738],{},[2170,2735,2736],{},[199,2737,261],{},[2170,2739,2740,2741,624],{},"Connection URL for MySQL. Falls back to ",[199,2742,211],{},[308,2744,2745,2746,2749],{},"Apply migrations manually after deployment using ",[199,2747,2748],{},"npx nuxt db migrate"," or your CI/CD pipeline.",[165,2751,2753],{"id":2752},"read-replicas","Read Replicas",[144,2755,2756,2757,2764,2765,293,2767,2769],{},"NuxtHub supports read replicas using Drizzle ORM's ",[148,2758,2761],{"href":2759,"rel":2760},"https://orm.drizzle.team/docs/read-replicas",[152],[199,2762,2763],{},"withReplicas()"," feature for ",[199,2766,207],{},[199,2768,255],{}," drivers. When configured, read queries are automatically routed to replicas while write queries go to the primary database.",[144,2771,2772,2773,380],{},"Configure replicas in your ",[199,2774,314],{},[173,2776,2777,2892],{"sync":175},[177,2778,2779],{"icon":179,"label":180},[339,2780,2782],{"className":341,"code":2781,"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,2783,2784,2796,2804,2812,2826,2836,2852,2865,2878,2882,2886],{"__ignoreMap":344},[348,2785,2786,2788,2790,2792,2794],{"class":350,"line":351},[348,2787,355],{"class":354},[348,2789,358],{"class":354},[348,2791,362],{"class":361},[348,2793,366],{"class":365},[348,2795,370],{"class":369},[348,2797,2798,2800,2802],{"class":350,"line":373},[348,2799,377],{"class":376},[348,2801,380],{"class":369},[348,2803,383],{"class":369},[348,2805,2806,2808,2810],{"class":350,"line":386},[348,2807,389],{"class":376},[348,2809,380],{"class":369},[348,2811,383],{"class":369},[348,2813,2814,2816,2818,2820,2822,2824],{"class":350,"line":404},[348,2815,1707],{"class":376},[348,2817,380],{"class":369},[348,2819,394],{"class":369},[348,2821,398],{"class":397},[348,2823,600],{"class":369},[348,2825,632],{"class":369},[348,2827,2828,2831,2833],{"class":350,"line":410},[348,2829,2830],{"class":376},"      replicas",[348,2832,380],{"class":369},[348,2834,2835],{"class":365}," [\n",[348,2837,2838,2841,2843,2845,2847,2850],{"class":350,"line":655},[348,2839,2840],{"class":365},"        process",[348,2842,624],{"class":369},[348,2844,1760],{"class":365},[348,2846,624],{"class":369},[348,2848,2849],{"class":365},"DATABASE_URL_REPLICA_1",[348,2851,632],{"class":369},[348,2853,2854,2856,2858,2860,2862],{"class":350,"line":682},[348,2855,2840],{"class":365},[348,2857,624],{"class":369},[348,2859,1760],{"class":365},[348,2861,624],{"class":369},[348,2863,2864],{"class":365},"DATABASE_URL_REPLICA_2\n",[348,2866,2867,2870,2872,2875],{"class":350,"line":702},[348,2868,2869],{"class":365},"      ]",[348,2871,624],{"class":369},[348,2873,2874],{"class":361},"filter",[348,2876,2877],{"class":365},"(Boolean)\n",[348,2879,2880],{"class":350,"line":722},[348,2881,1344],{"class":369},[348,2883,2884],{"class":350,"line":749},[348,2885,407],{"class":369},[348,2887,2888,2890],{"class":350,"line":1650},[348,2889,413],{"class":369},[348,2891,416],{"class":365},[177,2893,2894],{"icon":240,"label":241},[339,2895,2897],{"className":341,"code":2896,"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,2898,2899,2911,2919,2927,2941,2949,2963,2975,2985,2989,2993],{"__ignoreMap":344},[348,2900,2901,2903,2905,2907,2909],{"class":350,"line":351},[348,2902,355],{"class":354},[348,2904,358],{"class":354},[348,2906,362],{"class":361},[348,2908,366],{"class":365},[348,2910,370],{"class":369},[348,2912,2913,2915,2917],{"class":350,"line":373},[348,2914,377],{"class":376},[348,2916,380],{"class":369},[348,2918,383],{"class":369},[348,2920,2921,2923,2925],{"class":350,"line":386},[348,2922,389],{"class":376},[348,2924,380],{"class":369},[348,2926,383],{"class":369},[348,2928,2929,2931,2933,2935,2937,2939],{"class":350,"line":404},[348,2930,1707],{"class":376},[348,2932,380],{"class":369},[348,2934,394],{"class":369},[348,2936,454],{"class":397},[348,2938,600],{"class":369},[348,2940,632],{"class":369},[348,2942,2943,2945,2947],{"class":350,"line":410},[348,2944,2830],{"class":376},[348,2946,380],{"class":369},[348,2948,2835],{"class":365},[348,2950,2951,2953,2955,2957,2959,2961],{"class":350,"line":655},[348,2952,2840],{"class":365},[348,2954,624],{"class":369},[348,2956,1760],{"class":365},[348,2958,624],{"class":369},[348,2960,2849],{"class":365},[348,2962,632],{"class":369},[348,2964,2965,2967,2969,2971,2973],{"class":350,"line":682},[348,2966,2840],{"class":365},[348,2968,624],{"class":369},[348,2970,1760],{"class":365},[348,2972,624],{"class":369},[348,2974,2864],{"class":365},[348,2976,2977,2979,2981,2983],{"class":350,"line":702},[348,2978,2869],{"class":365},[348,2980,624],{"class":369},[348,2982,2874],{"class":361},[348,2984,2877],{"class":365},[348,2986,2987],{"class":350,"line":722},[348,2988,1344],{"class":369},[348,2990,2991],{"class":350,"line":749},[348,2992,407],{"class":369},[348,2994,2995,2997],{"class":350,"line":1650},[348,2996,413],{"class":369},[348,2998,416],{"class":365},[165,3000,3002],{"id":3001},"cloudflare-hyperdrive","Cloudflare Hyperdrive",[144,3004,3005,3006,380],{},"When using Cloudflare Hyperdrive, you first have to set up Hyperdrive in Cloudflare and set the generated ID in ",[199,3007,314],{},[339,3009,3011],{"className":341,"code":3010,"filename":314,"language":343,"meta":344,"style":344},"export default defineNuxtConfig({\n  hub: {\n    db: {\n      dialect: 'postgresql',\n      connection: {\n        hyperdriveId: '\u003Cyour-hyperdrive-id>',\n      },\n    },\n  },\n})\n",[199,3012,3013,3025,3033,3041,3055,3063,3079,3084,3089,3094],{"__ignoreMap":344},[348,3014,3015,3017,3019,3021,3023],{"class":350,"line":351},[348,3016,355],{"class":354},[348,3018,358],{"class":354},[348,3020,362],{"class":361},[348,3022,366],{"class":365},[348,3024,370],{"class":369},[348,3026,3027,3029,3031],{"class":350,"line":373},[348,3028,377],{"class":376},[348,3030,380],{"class":369},[348,3032,383],{"class":369},[348,3034,3035,3037,3039],{"class":350,"line":386},[348,3036,389],{"class":376},[348,3038,380],{"class":369},[348,3040,383],{"class":369},[348,3042,3043,3045,3047,3049,3051,3053],{"class":350,"line":404},[348,3044,1707],{"class":376},[348,3046,380],{"class":369},[348,3048,394],{"class":369},[348,3050,398],{"class":397},[348,3052,600],{"class":369},[348,3054,632],{"class":369},[348,3056,3057,3059,3061],{"class":350,"line":410},[348,3058,1741],{"class":376},[348,3060,380],{"class":369},[348,3062,383],{"class":369},[348,3064,3065,3068,3070,3072,3075,3077],{"class":350,"line":655},[348,3066,3067],{"class":376},"        hyperdriveId",[348,3069,380],{"class":369},[348,3071,394],{"class":369},[348,3073,3074],{"class":397},"\u003Cyour-hyperdrive-id>",[348,3076,600],{"class":369},[348,3078,632],{"class":369},[348,3080,3081],{"class":350,"line":682},[348,3082,3083],{"class":369},"      },\n",[348,3085,3086],{"class":350,"line":702},[348,3087,3088],{"class":369},"    },\n",[348,3090,3091],{"class":350,"line":722},[348,3092,3093],{"class":369},"  },\n",[348,3095,3096,3098],{"class":350,"line":749},[348,3097,413],{"class":369},[348,3099,416],{"class":365},[144,3101,3102],{},"If you want to apply migrations during build, you also need to set the direct database connection string in your environment variables. With this, NuxtHub will apply migrations on build to the configured database connection.",[308,3104,3105],{},"Use direct database connection string instead of pooling when configuring Hyperdrive.",[156,3107,3109],{"id":3108},"ai-agents","AI Agents",[144,3111,3112,3113,258,3116,3119],{},"If you work with an IDE that supports AI agents, you can add the following text in your ",[199,3114,3115],{},"Agents.md",[199,3117,3118],{},".cursor/rules"," file:",[339,3121,3125],{"className":3122,"code":3123,"language":3124,"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,3126,3127,3135,3139,3144,3148,3156,3160,3208,3232,3255,3279,3293,3320,3338,3365],{"__ignoreMap":344},[348,3128,3129,3132],{"class":350,"line":351},[348,3130,3131],{"class":369},"# ",[348,3133,3134],{"class":1192},"Agent Instructions\n",[348,3136,3137],{"class":350,"line":373},[348,3138,579],{"emptyLinePlaceholder":578},[348,3140,3141],{"class":350,"line":386},[348,3142,3143],{"class":365},"/** ... your agent instructions ... */\n",[348,3145,3146],{"class":350,"line":404},[348,3147,579],{"emptyLinePlaceholder":578},[348,3149,3150,3153],{"class":350,"line":410},[348,3151,3152],{"class":369},"## ",[348,3154,3155],{"class":1192},"Database\n",[348,3157,3158],{"class":350,"line":655},[348,3159,579],{"emptyLinePlaceholder":578},[348,3161,3162,3165,3169,3173,3176,3179,3181,3183,3185,3188,3190,3193,3195,3198,3200,3203,3205],{"class":350,"line":682},[348,3163,3164],{"class":369},"-",[348,3166,3168],{"class":3167},"sHepR"," **",[348,3170,3172],{"class":3171},"so75L","Database Dialect",[348,3174,3175],{"class":3167},"**",[348,3177,3178],{"class":365},": The database dialect is set in the ",[348,3180,1617],{"class":369},[348,3182,314],{"class":397},[348,3184,1617],{"class":369},[348,3186,3187],{"class":365}," file, within the ",[348,3189,1617],{"class":369},[348,3191,3192],{"class":397},"hub.db",[348,3194,1617],{"class":369},[348,3196,3197],{"class":365}," option or ",[348,3199,1617],{"class":369},[348,3201,3202],{"class":397},"hub.db.dialect",[348,3204,1617],{"class":369},[348,3206,3207],{"class":365}," property.\n",[348,3209,3210,3212,3214,3217,3219,3222,3224,3227,3229],{"class":350,"line":702},[348,3211,3164],{"class":369},[348,3213,3168],{"class":3167},[348,3215,3216],{"class":3171},"Drizzle Config",[348,3218,3175],{"class":3167},[348,3220,3221],{"class":365},": Don't generate the ",[348,3223,1617],{"class":369},[348,3225,3226],{"class":397},"drizzle.config.ts",[348,3228,1617],{"class":369},[348,3230,3231],{"class":365}," file manually, it is generated automatically by NuxtHub.\n",[348,3233,3234,3236,3238,3241,3243,3246,3248,3250,3252],{"class":350,"line":722},[348,3235,3164],{"class":369},[348,3237,3168],{"class":3167},[348,3239,3240],{"class":3171},"Generate Migrations",[348,3242,3175],{"class":3167},[348,3244,3245],{"class":365},": Use ",[348,3247,1617],{"class":369},[348,3249,1225],{"class":397},[348,3251,1617],{"class":369},[348,3253,3254],{"class":365}," to automatically generate database migrations from schema changes\n",[348,3256,3257,3259,3261,3264,3266,3269,3271,3274,3276],{"class":350,"line":749},[348,3258,3164],{"class":369},[348,3260,3168],{"class":3167},[348,3262,3263],{"class":3171},"Never Write Manual Migrations",[348,3265,3175],{"class":3167},[348,3267,3268],{"class":365},": Do not manually create SQL migration files in the ",[348,3270,1617],{"class":369},[348,3272,3273],{"class":397},"server/db/migrations/",[348,3275,1617],{"class":369},[348,3277,3278],{"class":365}," directory\n",[348,3280,3281,3283,3285,3288,3290],{"class":350,"line":1650},[348,3282,3164],{"class":369},[348,3284,3168],{"class":3167},[348,3286,3287],{"class":3171},"Workflow",[348,3289,3175],{"class":3167},[348,3291,3292],{"class":365},":\n",[348,3294,3296,3299,3302,3304,3306,3308,3311,3313,3316,3318],{"class":350,"line":3295},12,[348,3297,3298],{"class":369},"  1.",[348,3300,3301],{"class":365}," Create or modify the database schema in ",[348,3303,1617],{"class":369},[348,3305,531],{"class":397},[348,3307,1617],{"class":369},[348,3309,3310],{"class":365}," or any other schema file in the ",[348,3312,1617],{"class":369},[348,3314,3315],{"class":397},"server/db/schema/",[348,3317,1617],{"class":369},[348,3319,3278],{"class":365},[348,3321,3323,3326,3329,3331,3333,3335],{"class":350,"line":3322},13,[348,3324,3325],{"class":369},"  2.",[348,3327,3328],{"class":365}," Run ",[348,3330,1617],{"class":369},[348,3332,1225],{"class":397},[348,3334,1617],{"class":369},[348,3336,3337],{"class":365}," to generate the migration\n",[348,3339,3341,3344,3346,3348,3350,3352,3355,3357,3360,3362],{"class":350,"line":3340},14,[348,3342,3343],{"class":369},"  3.",[348,3345,3328],{"class":365},[348,3347,1617],{"class":369},[348,3349,2748],{"class":397},[348,3351,1617],{"class":369},[348,3353,3354],{"class":365}," to apply the migration to the database, or run ",[348,3356,1617],{"class":369},[348,3358,3359],{"class":397},"npx nuxt dev",[348,3361,1617],{"class":369},[348,3363,3364],{"class":365}," to apply the migration during development\n",[348,3366,3368,3370,3372,3375,3377,3380,3382,3384,3386,3388,3390,3392,3394,3397,3399,3402,3404],{"class":350,"line":3367},15,[348,3369,3164],{"class":369},[348,3371,3168],{"class":3167},[348,3373,3374],{"class":3171},"Access the database",[348,3376,3175],{"class":3167},[348,3378,3379],{"class":365},": Use the ",[348,3381,1617],{"class":369},[348,3383,332],{"class":397},[348,3385,1617],{"class":369},[348,3387,1215],{"class":365},[348,3389,1617],{"class":369},[348,3391,1218],{"class":397},[348,3393,1617],{"class":369},[348,3395,3396],{"class":365}," (or ",[348,3398,1617],{"class":369},[348,3400,3401],{"class":397},"hub:db",[348,3403,1617],{"class":369},[348,3405,3406],{"class":365}," for backwards compatibility) to query the database, it is a Drizzle ORM instance.\n",[156,3408,3410],{"id":3409},"migrating-from-v09","Migrating from v0.9",[1220,3412,3413,3416,3417,3420],{},[1170,3414,3415],{},"Breaking changes in NuxtHub v0.10:"," If you're upgrading from a previous version that used ",[199,3418,3419],{},"hubDatabase()",", follow this migration guide.",[165,3422,3424],{"id":3423},"configuration-changes","Configuration changes",[144,3426,3427,3428,3431,3432,3434],{},"The ",[199,3429,3430],{},"database"," option has been renamed to ",[199,3433,332],{}," and now accepts a SQL dialect instead of a boolean.",[339,3436,3440],{"className":3437,"code":3438,"filename":314,"language":3439,"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,3441,3442,3447,3452,3459,3467,3471],{"__ignoreMap":344},[348,3443,3444],{"class":350,"line":351},[348,3445,3446],{"class":365},"export default defineNuxtConfig({\n",[348,3448,3449],{"class":350,"line":373},[348,3450,3451],{"class":365},"  hub: {\n",[348,3453,3454,3456],{"class":350,"line":386},[348,3455,3164],{"class":369},[348,3457,3458],{"class":376},"    database: true\n",[348,3460,3461,3464],{"class":350,"line":404},[348,3462,3463],{"class":369},"+",[348,3465,3466],{"class":397},"    db: 'sqlite'\n",[348,3468,3469],{"class":350,"line":410},[348,3470,407],{"class":365},[348,3472,3473],{"class":350,"line":655},[348,3474,3475],{"class":365},"})\n",[144,3477,3478,3479,212,3481,293,3483,624],{},"Valid dialects are ",[199,3480,504],{},[199,3482,398],{},[199,3484,454],{},[165,3486,3488],{"id":3487},"directory-changes","Directory changes",[144,3490,3491,3492,3495,3496,380],{},"The database directory has been renamed from ",[199,3493,3494],{},"server/database/"," to ",[199,3497,3498],{},"server/db/",[339,3500,3502],{"className":3437,"code":3501,"language":3439,"meta":344,"style":344},"- server/database/schema.ts\n+ server/db/schema.ts\n\n- server/database/migrations/\n+ server/db/migrations/\n",[199,3503,3504,3511,3518,3522,3529],{"__ignoreMap":344},[348,3505,3506,3508],{"class":350,"line":351},[348,3507,3164],{"class":369},[348,3509,3510],{"class":376}," server/database/schema.ts\n",[348,3512,3513,3515],{"class":350,"line":373},[348,3514,3463],{"class":369},[348,3516,3517],{"class":397}," server/db/schema.ts\n",[348,3519,3520],{"class":350,"line":386},[348,3521,579],{"emptyLinePlaceholder":578},[348,3523,3524,3526],{"class":350,"line":404},[348,3525,3164],{"class":369},[348,3527,3528],{"class":376}," server/database/migrations/\n",[348,3530,3531,3533],{"class":350,"line":410},[348,3532,3463],{"class":369},[348,3534,3535],{"class":397}," server/db/migrations/\n",[144,3537,3538],{},"Make sure to move your schema and migration files to the new location.",[165,3540,3542],{"id":3541},"api-changes","API changes",[144,3544,3545,3546,3548],{},"The old ",[199,3547,3419],{}," function has been removed. You must now use Drizzle ORM.",[144,3550,3551],{},[1170,3552,3553],{},"Before:",[339,3555,3557],{"className":341,"code":3556,"language":343,"meta":344,"style":344},"const db = hubDatabase()\nconst result = await db.prepare('SELECT * FROM users').all()\n",[199,3558,3559,3575],{"__ignoreMap":344},[348,3560,3561,3564,3567,3569,3572],{"class":350,"line":351},[348,3562,3563],{"class":586},"const",[348,3565,3566],{"class":365}," db ",[348,3568,593],{"class":369},[348,3570,3571],{"class":361}," hubDatabase",[348,3573,3574],{"class":365},"()\n",[348,3576,3577,3579,3582,3584,3587,3589,3591,3594,3596,3598,3601,3603,3605,3607,3610],{"class":350,"line":373},[348,3578,3563],{"class":586},[348,3580,3581],{"class":365}," result ",[348,3583,593],{"class":369},[348,3585,3586],{"class":354}," await",[348,3588,1199],{"class":365},[348,3590,624],{"class":369},[348,3592,3593],{"class":361},"prepare",[348,3595,366],{"class":365},[348,3597,600],{"class":369},[348,3599,3600],{"class":397},"SELECT * FROM users",[348,3602,600],{"class":369},[348,3604,1043],{"class":365},[348,3606,624],{"class":369},[348,3608,3609],{"class":361},"all",[348,3611,3574],{"class":365},[144,3613,3614],{},[1170,3615,3616],{},"After:",[339,3618,3620],{"className":341,"code":3619,"language":343,"meta":344,"style":344},"const result = await db.select().from(tables.users)\n",[199,3621,3622],{"__ignoreMap":344},[348,3623,3624,3626,3628,3630,3632,3634,3636,3639,3641,3643,3646,3649,3651],{"class":350,"line":351},[348,3625,3563],{"class":586},[348,3627,3581],{"class":365},[348,3629,593],{"class":369},[348,3631,3586],{"class":354},[348,3633,1199],{"class":365},[348,3635,624],{"class":369},[348,3637,3638],{"class":361},"select",[348,3640,621],{"class":365},[348,3642,624],{"class":369},[348,3644,3645],{"class":361},"from",[348,3647,3648],{"class":365},"(tables",[348,3650,624],{"class":369},[348,3652,3653],{"class":365},"users)\n",[165,3655,3657],{"id":3656},"migration-files","Migration files",[144,3659,3660,3661,624],{},"Your existing SQL migration files continue to work! Just move them to ",[199,3662,3273],{},[3664,3665,3666],"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":3668},[3669,3675,3676,3677,3685,3686],{"id":158,"depth":373,"text":159,"children":3670},[3671,3672,3673,3674],{"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":1254,"depth":373,"text":1255},{"id":1665,"depth":373,"text":1666,"children":3678},[3679,3680,3681,3682,3683,3684],{"id":1787,"depth":386,"text":1788},{"id":2063,"depth":386,"text":2064},{"id":2214,"depth":386,"text":2215},{"id":2346,"depth":386,"text":2347},{"id":2752,"depth":386,"text":2753},{"id":3001,"depth":386,"text":3002},{"id":3108,"depth":373,"text":3109},{"id":3409,"depth":373,"text":3410,"children":3687},[3688,3689,3690,3691],{"id":3423,"depth":386,"text":3424},{"id":3487,"depth":386,"text":3488},{"id":3541,"depth":386,"text":3542},{"id":3656,"depth":386,"text":3657},"Setup your SQL database in Nuxt with Drizzle ORM, including installation, environment setup, and database connection.",null,{},{"title":40},{"title":139,"description":3692},"GRICIADL6mY9zvCAw8CfOQxhJ60pVHORlKBcKpQ63ww",[3699,3701],{"title":30,"path":31,"stem":32,"description":3700,"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":3702,"children":-1},"Define and manage your database schema with Drizzle ORM in Nuxt, including tables, columns, relations, and type-safe models.",1785428316620]