[{"data":1,"prerenderedAt":1075},["ShallowReactive",2],{"navigation_docs":3,"landing":106},[4,26,57,83],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting Started","i-lucide-rocket","/getting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-play",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Core Concepts","i-lucide-book-open","/essentials","2.essentials",[32,37,42,47,52],{"title":33,"path":34,"stem":35,"icon":36},"Models","/essentials/models","2.essentials/1.models","i-lucide-box",{"title":38,"path":39,"stem":40,"icon":41},"Collections","/essentials/collections","2.essentials/2.collections","i-lucide-folder",{"title":43,"path":44,"stem":45,"icon":46},"Views","/essentials/views","2.essentials/3.views","i-lucide-table",{"title":48,"path":49,"stem":50,"icon":51},"Schema Evolution","/essentials/schema-evolution","2.essentials/4.schema-evolution","i-lucide-git-branch",{"title":53,"path":54,"stem":55,"icon":56},"Relations","/essentials/relations","2.essentials/5.relations","i-lucide-link",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":25},"Advanced","i-lucide-settings","/advanced","3.advanced",[63,68,73,78],{"title":64,"path":65,"stem":66,"icon":67},"Time-Series","/advanced/time-series","3.advanced/1.time-series","i-lucide-chart-line",{"title":69,"path":70,"stem":71,"icon":72},"Async Support","/advanced/async","3.advanced/2.async","i-lucide-zap",{"title":74,"path":75,"stem":76,"icon":77},"PostgreSQL","/advanced/postgresql","3.advanced/3.postgresql","i-lucide-database",{"title":79,"path":80,"stem":81,"icon":82},"Performance Guide","/advanced/performance","3.advanced/4.performance","i-lucide-gauge",{"title":84,"icon":85,"path":86,"stem":87,"children":88,"page":25},"API Reference","i-lucide-file-code","/api","4.api",[89,94,98,101],{"title":90,"path":91,"stem":92,"icon":93},"Engine","/api/engine","4.api/1.engine","i-lucide-cog",{"title":95,"path":96,"stem":97,"icon":41},"Collection","/api/collection","4.api/2.collection",{"title":33,"path":99,"stem":100,"icon":36},"/api/models","4.api/3.models",{"title":102,"path":103,"stem":104,"icon":105},"Exceptions","/api/exceptions","4.api/4.exceptions","i-lucide-alert-triangle",{"id":107,"title":108,"body":109,"description":108,"extension":1067,"meta":1068,"navigation":440,"path":1069,"seo":1070,"stem":1073,"__hash__":1074},"landing/index.md","",{"type":110,"value":111,"toc":1065},"minimark",[112,120,175,327,367,1042,1061],[113,114],"u-banner",{":close":115,":ui":116,"icon":117,"id":118,"title":119},"true","{\"root\":\"bg-warning/10 border-b border-warning/25\",\"icon\":\"text-warning\",\"title\":\"text-warning-600 dark:text-warning-300\",\"close\":\"text-warning-600 dark:text-warning-300 hover:bg-warning/10\"}","i-lucide-flask-conical","beta-0-9","CentauroDB is in beta",[121,122,125,135,156,159],"u-page-hero",{":ui":123,"orientation":124},"{\"root\":\"relative bg-gradient-to-b from-primary/5 to-transparent\",\"container\":\"flex flex-col lg:grid py-12 sm:py-16 lg:py-20 gap-8 sm:gap-12\",\"title\":\"text-4xl sm:text-7xl\"}","horizontal",[126,127,129],"div",{"style":128},"display: flex; justify-content: center; pointer-events: none;",[130,131],"img",{"src":132,"alt":133,"style":134},"/logo-1.svg","CentauroDB Logo","width: min(480px, 80vw); height: auto;",[136,137,138,143,144,150,151],"template",{"v-slot:title":108},[139,140],"rotating-text",{":interval":141,":words":142},"2000","[\"Pydantic Models\", \"SQL Views\", \"Time-Series\", \"Async Ready\", \"Schema Freedom\"]"," — ",[145,146,149],"span",{"className":147},[148],"text-primary","No Migrations."," ",[145,152,155],{"className":153},[154],"text-secondary","Ever.",[136,157,158],{"v-slot:description":108},"Store Pydantic models as JSON. Query them with plain SQL. Change your schema whenever you want — old data keeps working.",[136,160,161,166],{"v-slot:links":108},[162,163,165],"shimmer-button",{"to":12,"trailing-icon":164},"i-lucide-arrow-right","Try it in 30 seconds",[167,168,174],"u-button",{"color":169,"icon":170,"size":171,"to":172,"variant":173},"neutral","simple-icons-github","xl","https://github.com/aropele/centaurodb","outline","Star on GitHub",[176,177,179,186,189,220,229],"u-page-section",{":ui":178,"orientation":124},"{\"container\":\"flex flex-col lg:grid py-8 sm:py-12 lg:py-16 gap-4 sm:gap-8\"}",[136,180,181,182],{"v-slot:title":108},"This is what you're doing ",[145,183,185],{"className":184},[148],"right now",[136,187,188],{"v-slot:description":108},"Every time your schema changes with a traditional ORM, this is the ceremony:",[190,191,192],"steps",{},[193,194,195,199,206,209,214,217],"ol",{},[196,197,198],"li",{},"Edit model class",[196,200,201,202],{},"Run ",[203,204,205],"code",{},"alembic revision --autogenerate -m \"add location field\"",[196,207,208],{},"Review the generated migration",[196,210,201,211],{},[203,212,213],{},"alembic upgrade head",[196,215,216],{},"Repeat for staging. Repeat for production.",[196,218,219],{},"Hope nothing breaks.",[221,222,223,224,228],"p",{},"With CentauroDB, you ",[225,226,227],"strong",{},"edit the model and you're done."," No step 2. No step 3. No step 6. Old data still loads. New data uses the new schema. Views update with one call.",[230,231,235],"pre",{"className":232,"code":233,"language":234,"meta":108,"style":108},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# That's it. Add a field, add a default. Done.\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    unit: str = \"\"\n    location: str = \"unknown\"  # old rows get \"unknown\" automatically\n","python",[203,236,237,245,266,286,304],{"__ignoreMap":108},[145,238,241],{"class":239,"line":240},"line",1,[145,242,244],{"class":243},"sHwdD","# That's it. Add a field, add a default. Done.\n",[145,246,248,252,256,260,263],{"class":239,"line":247},2,[145,249,251],{"class":250},"spNyl","class",[145,253,255],{"class":254},"sBMFI"," Sensor",[145,257,259],{"class":258},"sMK4o","(",[145,261,262],{"class":254},"CentauroModel",[145,264,265],{"class":258},"):\n",[145,267,269,273,276,279,283],{"class":239,"line":268},3,[145,270,272],{"class":271},"sTEyZ","    __centauro_name__ ",[145,274,275],{"class":258},"=",[145,277,278],{"class":258}," \"",[145,280,282],{"class":281},"sfazB","Sensor",[145,284,285],{"class":258},"\"\n",[145,287,289,292,295,298,301],{"class":239,"line":288},4,[145,290,291],{"class":271},"    unit",[145,293,294],{"class":258},":",[145,296,297],{"class":254}," str",[145,299,300],{"class":258}," =",[145,302,303],{"class":258}," \"\"\n",[145,305,307,310,312,314,316,318,321,324],{"class":239,"line":306},5,[145,308,309],{"class":271},"    location",[145,311,294],{"class":258},[145,313,297],{"class":254},[145,315,300],{"class":258},[145,317,278],{"class":258},[145,319,320],{"class":281},"unknown",[145,322,323],{"class":258},"\"",[145,325,326],{"class":243},"  # old rows get \"unknown\" automatically\n",[176,328,329,336],{":ui":178},[136,330,331,332],{"v-slot:title":108},"What you get ",[145,333,335],{"className":334},[148],"out of the box",[337,338,339,346,350,354,359,363],"u-page-grid",{},[340,341],"u-page-card",{":spotlight":115,"description":342,"icon":343,"spotlight-color":344,"title":345},"Add, remove, or rename fields — no migration files, no ALTER TABLE, no downtime. Old data still loads. New data uses the new shape.","i-lucide-shield-off","primary","Zero Migrations",[340,347],{":spotlight":115,"description":348,"icon":46,"spotlight-color":344,"title":349},"One call turns your JSON into real SQL columns. Query with DBeaver, Metabase, Jupyter, or raw SELECT * FROM.","Auto SQL Views",[340,351],{":spotlight":115,"description":352,"icon":67,"spotlight-color":344,"title":353},"Sensor readings, financial ticks, metrics — TimeSeriesCollection stores them and gives you a Polars DataFrame in one line.","Built-in Time-Series",[340,355],{":spotlight":115,"description":356,"icon":357,"spotlight-color":344,"title":358},"Your models are standard Pydantic classes. Validation on every read and write. No new ORM to learn.","i-simple-icons-pydantic","Pydantic v2 Native",[340,360],{":spotlight":115,"description":361,"icon":77,"spotlight-color":344,"title":362},"Start with a single .db file. Move to PostgreSQL by changing one connection string. Same code, same API.","SQLite + PostgreSQL",[340,364],{":spotlight":115,"description":365,"icon":72,"spotlight-color":344,"title":366},"AsyncCollection drops into FastAPI and any async framework. No wrapper hacks, no thread pool juggling.","Async Ready",[176,368,369,376,379],{":ui":178,"orientation":124},[136,370,371,372],{"v-slot:title":108},"Four schema changes. ",[145,373,375],{"className":374},[148],"Zero migrations.",[136,377,378],{"v-slot:description":108},"Your model is live and the database is full of rows. Now change it. Each tab below is a schema change that would cost you an Alembic migration — here you edit the class, redeploy, and the old rows keep loading. The last lines of each example are the proof.",[380,381,382,563,716,908],"tabs",{},[383,384,387,390],"tabs-item",{"icon":385,"label":386},"i-lucide-plus","Add a field",[221,388,389],{},"Old rows don't have the new key — Pydantic fills in the default on read.",[230,391,393],{"className":232,"code":392,"language":234,"meta":108,"style":108},"# v1 — in production, thousands of rows already written\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    unit: str = \"\"\n\n# v2 — add the field, give it a default. That's the whole change.\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    unit: str = \"\"\n    location: str = \"unknown\"\n\n# the old rows? Still load fine:\nsensors = coll.read_objects(Sensor)\nsensors[0].location  # \"unknown\" — filled in on read\n",[203,394,395,400,412,424,436,442,448,461,474,487,504,509,515,540],{"__ignoreMap":108},[145,396,397],{"class":239,"line":240},[145,398,399],{"class":243},"# v1 — in production, thousands of rows already written\n",[145,401,402,404,406,408,410],{"class":239,"line":247},[145,403,251],{"class":250},[145,405,255],{"class":254},[145,407,259],{"class":258},[145,409,262],{"class":254},[145,411,265],{"class":258},[145,413,414,416,418,420,422],{"class":239,"line":268},[145,415,272],{"class":271},[145,417,275],{"class":258},[145,419,278],{"class":258},[145,421,282],{"class":281},[145,423,285],{"class":258},[145,425,426,428,430,432,434],{"class":239,"line":288},[145,427,291],{"class":271},[145,429,294],{"class":258},[145,431,297],{"class":254},[145,433,300],{"class":258},[145,435,303],{"class":258},[145,437,438],{"class":239,"line":306},[145,439,441],{"emptyLinePlaceholder":440},true,"\n",[145,443,445],{"class":239,"line":444},6,[145,446,447],{"class":243},"# v2 — add the field, give it a default. That's the whole change.\n",[145,449,451,453,455,457,459],{"class":239,"line":450},7,[145,452,251],{"class":250},[145,454,255],{"class":254},[145,456,259],{"class":258},[145,458,262],{"class":254},[145,460,265],{"class":258},[145,462,464,466,468,470,472],{"class":239,"line":463},8,[145,465,272],{"class":271},[145,467,275],{"class":258},[145,469,278],{"class":258},[145,471,282],{"class":281},[145,473,285],{"class":258},[145,475,477,479,481,483,485],{"class":239,"line":476},9,[145,478,291],{"class":271},[145,480,294],{"class":258},[145,482,297],{"class":254},[145,484,300],{"class":258},[145,486,303],{"class":258},[145,488,490,492,494,496,498,500,502],{"class":239,"line":489},10,[145,491,309],{"class":271},[145,493,294],{"class":258},[145,495,297],{"class":254},[145,497,300],{"class":258},[145,499,278],{"class":258},[145,501,320],{"class":281},[145,503,285],{"class":258},[145,505,507],{"class":239,"line":506},11,[145,508,441],{"emptyLinePlaceholder":440},[145,510,512],{"class":239,"line":511},12,[145,513,514],{"class":243},"# the old rows? Still load fine:\n",[145,516,518,521,523,526,529,533,535,537],{"class":239,"line":517},13,[145,519,520],{"class":271},"sensors ",[145,522,275],{"class":258},[145,524,525],{"class":271}," coll",[145,527,528],{"class":258},".",[145,530,532],{"class":531},"s2Zo4","read_objects",[145,534,259],{"class":258},[145,536,282],{"class":531},[145,538,539],{"class":258},")\n",[145,541,543,546,549,553,556,560],{"class":239,"line":542},14,[145,544,545],{"class":271},"sensors",[145,547,548],{"class":258},"[",[145,550,552],{"class":551},"sbssI","0",[145,554,555],{"class":258},"].",[145,557,559],{"class":558},"swJcz","location",[145,561,562],{"class":243},"  # \"unknown\" — filled in on read\n",[383,564,567,570],{"icon":565,"label":566},"i-lucide-minus","Remove a field",[221,568,569],{},"Old rows still carry the key in their JSON — Pydantic silently ignores it.",[230,571,573],{"className":232,"code":572,"language":234,"meta":108,"style":108},"# v1 — in production, rows stored with unit AND location\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    unit: str = \"\"\n    location: str = \"\"\n\n# v2 — delete the field. Done.\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    unit: str = \"\"\n\n# old JSON still contains \"location\" — it's skipped on read:\nsensors = coll.read_objects(Sensor)\nsensors[0].unit  # loads cleanly, stale key ignored\n",[203,574,575,580,592,604,616,628,632,637,649,661,673,677,682,700],{"__ignoreMap":108},[145,576,577],{"class":239,"line":240},[145,578,579],{"class":243},"# v1 — in production, rows stored with unit AND location\n",[145,581,582,584,586,588,590],{"class":239,"line":247},[145,583,251],{"class":250},[145,585,255],{"class":254},[145,587,259],{"class":258},[145,589,262],{"class":254},[145,591,265],{"class":258},[145,593,594,596,598,600,602],{"class":239,"line":268},[145,595,272],{"class":271},[145,597,275],{"class":258},[145,599,278],{"class":258},[145,601,282],{"class":281},[145,603,285],{"class":258},[145,605,606,608,610,612,614],{"class":239,"line":288},[145,607,291],{"class":271},[145,609,294],{"class":258},[145,611,297],{"class":254},[145,613,300],{"class":258},[145,615,303],{"class":258},[145,617,618,620,622,624,626],{"class":239,"line":306},[145,619,309],{"class":271},[145,621,294],{"class":258},[145,623,297],{"class":254},[145,625,300],{"class":258},[145,627,303],{"class":258},[145,629,630],{"class":239,"line":444},[145,631,441],{"emptyLinePlaceholder":440},[145,633,634],{"class":239,"line":450},[145,635,636],{"class":243},"# v2 — delete the field. Done.\n",[145,638,639,641,643,645,647],{"class":239,"line":463},[145,640,251],{"class":250},[145,642,255],{"class":254},[145,644,259],{"class":258},[145,646,262],{"class":254},[145,648,265],{"class":258},[145,650,651,653,655,657,659],{"class":239,"line":476},[145,652,272],{"class":271},[145,654,275],{"class":258},[145,656,278],{"class":258},[145,658,282],{"class":281},[145,660,285],{"class":258},[145,662,663,665,667,669,671],{"class":239,"line":489},[145,664,291],{"class":271},[145,666,294],{"class":258},[145,668,297],{"class":254},[145,670,300],{"class":258},[145,672,303],{"class":258},[145,674,675],{"class":239,"line":506},[145,676,441],{"emptyLinePlaceholder":440},[145,678,679],{"class":239,"line":511},[145,680,681],{"class":243},"# old JSON still contains \"location\" — it's skipped on read:\n",[145,683,684,686,688,690,692,694,696,698],{"class":239,"line":517},[145,685,520],{"class":271},[145,687,275],{"class":258},[145,689,525],{"class":271},[145,691,528],{"class":258},[145,693,532],{"class":531},[145,695,259],{"class":258},[145,697,282],{"class":531},[145,699,539],{"class":258},[145,701,702,704,706,708,710,713],{"class":239,"line":542},[145,703,545],{"class":271},[145,705,548],{"class":258},[145,707,552],{"class":551},[145,709,555],{"class":258},[145,711,712],{"class":558},"unit",[145,714,715],{"class":243},"  # loads cleanly, stale key ignored\n",[383,717,720,726],{"icon":718,"label":719},"i-lucide-pencil","Rename a field",[221,721,722,725],{},[203,723,724],{},"renamed_from()"," reads old JSON keys under the new name — no data rewrite.",[230,727,729],{"className":232,"code":728,"language":234,"meta":108,"style":108},"from centaurodb import renamed_from\n\n# v1 — stored rows as {\"temp\": 42.0}\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    temp: float = 0.0\n\n# v2 — rename it, point at the old key\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    temperature: float = renamed_from(\"temp\", default=0.0)\n\n# rows written as {\"temp\": 42.0} load under the new name:\nsensors = coll.read_objects(Sensor)\nsensors[0].temperature  # 42.0\n",[203,730,731,746,750,755,767,779,794,798,803,815,827,864,868,873,891],{"__ignoreMap":108},[145,732,733,737,740,743],{"class":239,"line":240},[145,734,736],{"class":735},"s7zQu","from",[145,738,739],{"class":271}," centaurodb ",[145,741,742],{"class":735},"import",[145,744,745],{"class":271}," renamed_from\n",[145,747,748],{"class":239,"line":247},[145,749,441],{"emptyLinePlaceholder":440},[145,751,752],{"class":239,"line":268},[145,753,754],{"class":243},"# v1 — stored rows as {\"temp\": 42.0}\n",[145,756,757,759,761,763,765],{"class":239,"line":288},[145,758,251],{"class":250},[145,760,255],{"class":254},[145,762,259],{"class":258},[145,764,262],{"class":254},[145,766,265],{"class":258},[145,768,769,771,773,775,777],{"class":239,"line":306},[145,770,272],{"class":271},[145,772,275],{"class":258},[145,774,278],{"class":258},[145,776,282],{"class":281},[145,778,285],{"class":258},[145,780,781,784,786,789,791],{"class":239,"line":444},[145,782,783],{"class":271},"    temp",[145,785,294],{"class":258},[145,787,788],{"class":254}," float",[145,790,300],{"class":258},[145,792,793],{"class":551}," 0.0\n",[145,795,796],{"class":239,"line":450},[145,797,441],{"emptyLinePlaceholder":440},[145,799,800],{"class":239,"line":463},[145,801,802],{"class":243},"# v2 — rename it, point at the old key\n",[145,804,805,807,809,811,813],{"class":239,"line":476},[145,806,251],{"class":250},[145,808,255],{"class":254},[145,810,259],{"class":258},[145,812,262],{"class":254},[145,814,265],{"class":258},[145,816,817,819,821,823,825],{"class":239,"line":489},[145,818,272],{"class":271},[145,820,275],{"class":258},[145,822,278],{"class":258},[145,824,282],{"class":281},[145,826,285],{"class":258},[145,828,829,832,834,836,838,841,843,845,848,850,853,857,859,862],{"class":239,"line":506},[145,830,831],{"class":271},"    temperature",[145,833,294],{"class":258},[145,835,788],{"class":254},[145,837,300],{"class":258},[145,839,840],{"class":531}," renamed_from",[145,842,259],{"class":258},[145,844,323],{"class":258},[145,846,847],{"class":281},"temp",[145,849,323],{"class":258},[145,851,852],{"class":258},",",[145,854,856],{"class":855},"sHdIc"," default",[145,858,275],{"class":258},[145,860,861],{"class":551},"0.0",[145,863,539],{"class":258},[145,865,866],{"class":239,"line":511},[145,867,441],{"emptyLinePlaceholder":440},[145,869,870],{"class":239,"line":517},[145,871,872],{"class":243},"# rows written as {\"temp\": 42.0} load under the new name:\n",[145,874,875,877,879,881,883,885,887,889],{"class":239,"line":542},[145,876,520],{"class":271},[145,878,275],{"class":258},[145,880,525],{"class":271},[145,882,528],{"class":258},[145,884,532],{"class":531},[145,886,259],{"class":258},[145,888,282],{"class":531},[145,890,539],{"class":258},[145,892,894,896,898,900,902,905],{"class":239,"line":893},15,[145,895,545],{"class":271},[145,897,548],{"class":258},[145,899,552],{"class":551},[145,901,555],{"class":258},[145,903,904],{"class":558},"temperature",[145,906,907],{"class":243},"  # 42.0\n",[383,909,912,918],{"icon":910,"label":911},"i-lucide-replace","Rename a class",[221,913,914,917],{},[203,915,916],{},"__centauro_name__"," decouples the Python class name from the DB identity.",[230,919,921],{"className":232,"code":920,"language":234,"meta":108,"style":108},"# v1 — shipped with this name\nclass Sensor(CentauroModel):\n    __centauro_name__ = \"Sensor\"\n    unit: str = \"\"\n\n# v2 — class renamed; __centauro_name__ keeps the DB identity\nclass SensorReading(CentauroModel):\n    __centauro_name__ = \"Sensor\"   # same identity, same data\n    unit: str = \"\"\n\n# every row written as Sensor comes back as SensorReading:\nreadings = coll.read_objects(SensorReading)\n",[203,922,923,928,940,952,964,968,973,986,1001,1013,1017,1022],{"__ignoreMap":108},[145,924,925],{"class":239,"line":240},[145,926,927],{"class":243},"# v1 — shipped with this name\n",[145,929,930,932,934,936,938],{"class":239,"line":247},[145,931,251],{"class":250},[145,933,255],{"class":254},[145,935,259],{"class":258},[145,937,262],{"class":254},[145,939,265],{"class":258},[145,941,942,944,946,948,950],{"class":239,"line":268},[145,943,272],{"class":271},[145,945,275],{"class":258},[145,947,278],{"class":258},[145,949,282],{"class":281},[145,951,285],{"class":258},[145,953,954,956,958,960,962],{"class":239,"line":288},[145,955,291],{"class":271},[145,957,294],{"class":258},[145,959,297],{"class":254},[145,961,300],{"class":258},[145,963,303],{"class":258},[145,965,966],{"class":239,"line":306},[145,967,441],{"emptyLinePlaceholder":440},[145,969,970],{"class":239,"line":444},[145,971,972],{"class":243},"# v2 — class renamed; __centauro_name__ keeps the DB identity\n",[145,974,975,977,980,982,984],{"class":239,"line":450},[145,976,251],{"class":250},[145,978,979],{"class":254}," SensorReading",[145,981,259],{"class":258},[145,983,262],{"class":254},[145,985,265],{"class":258},[145,987,988,990,992,994,996,998],{"class":239,"line":463},[145,989,272],{"class":271},[145,991,275],{"class":258},[145,993,278],{"class":258},[145,995,282],{"class":281},[145,997,323],{"class":258},[145,999,1000],{"class":243},"   # same identity, same data\n",[145,1002,1003,1005,1007,1009,1011],{"class":239,"line":476},[145,1004,291],{"class":271},[145,1006,294],{"class":258},[145,1008,297],{"class":254},[145,1010,300],{"class":258},[145,1012,303],{"class":258},[145,1014,1015],{"class":239,"line":489},[145,1016,441],{"emptyLinePlaceholder":440},[145,1018,1019],{"class":239,"line":506},[145,1020,1021],{"class":243},"# every row written as Sensor comes back as SensorReading:\n",[145,1023,1024,1027,1029,1031,1033,1035,1037,1040],{"class":239,"line":511},[145,1025,1026],{"class":271},"readings ",[145,1028,275],{"class":258},[145,1030,525],{"class":271},[145,1032,528],{"class":258},[145,1034,532],{"class":531},[145,1036,259],{"class":258},[145,1038,1039],{"class":531},"SensorReading",[145,1041,539],{"class":258},[176,1043,1045,1053],{":ui":1044},"{\"container\":\"flex flex-col items-center text-center py-10 sm:py-14 lg:py-20 gap-4 sm:gap-8\"}",[136,1046,1047,1048,1052],{"v-slot:title":108},"Ready to drop the ",[145,1049,1051],{"className":1050},[148],"migrations","?",[126,1054,1058],{"className":1055},[1056,1057],"flex","justify-center",[162,1059,1060],{"to":12,"trailing-icon":164},"Get Started",[1062,1063,1064],"style",{},"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html 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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":108,"searchDepth":247,"depth":247,"links":1066},[],"md",{},"/",{"title":1071,"description":1072},"CentauroDB — Zero-Migration Database for Python","Store Pydantic models as flexible JSON, query them with plain SQL views. No migrations. Ever. SQLite & PostgreSQL.","index","9oUXkMbDFaxTEG__uZDfeKv4O4dA1L3VtBzGlhInMtA",1781105058366]