1<!doctype html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8"/> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <link rel="icon" type="image/png" href="/img/favicon.png"> 7 <title>litdb for postgres.js</title> 8
8<script> 9 if (location.search === "?dark") localStorage.setItem('color-scheme','dark') 10 if (location.search === "?light") localStorage.removeItem('color-scheme') 11 const cls = document.querySelector('html').classList 12 if (localStorage.getItem('color-scheme') === 'dark') 13 cls.add('dark') 14 else 15 cls.remove('dark') 16 </script>
16 17 <link rel="stylesheet" href="/css/app.css"> 18
18<script type="importmap"> 19{ 20 "imports": { 21 "app.mjs": "/mjs/app.mjs", 22 "vue": "/lib/mjs/vue.min.mjs", 23 "@servicestack/client": "/lib/mjs/servicestack-client.min.mjs", 24 "@servicestack/vue": "/lib/mjs/servicestack-vue.min.mjs", 25 "litdb": "/lib/mjs/litdb.min.js" 26 } 27} 28</script>
28 29</head> 30<body class="bg-white dark:bg-black dark:text-white"> 31<header id="header" class="top-0 fixed z-50 h-14 bg-white dark:bg-black opacity-90 w-full shadow"> 32 <nav class="border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-black"> 33 <div class="mx-auto max-w-[100rem] pr-4 sm:pr-6 lg:pr-8"> 34 <div class="flex h-16 justify-between"> 35 <div class="flex"> 36 <div class="flex flex-shrink-0 items-center"> 37 <a class="mr-2 lg:mr-8 flex items-center" href="/"> 38 <img class="w-8 h-8 mr-1 ml-2 rounded-full" src="/img/logo.png" alt="litdb logo"> 39 <span class="hidden sm:block text-2xl font-semibold">litdb</span> 40 </a> 41 </div> 42 <div class="hidden sm:-my-px sm:ml-6 sm:flex sm:space-x-4 lg:space-x-8"> 43 <!-- Current: "border-indigo-500 text-gray-900", Default: "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700" --> 44 <a href="/overview" class="inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:hover:text-gray-200"> 45 Documentation 46 </a> 47 <a href="https://github.com/litdb/litdb/discussions" class="inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:hover:text-gray-200"> 48 Discuss 49 </a> 50 <a href="https://github.com/litdb/litdb" class="inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:hover:text-gray-200"> 51 <span class='mr-1 text-xl'>☆</span> GitHub 52 </a> 53 </div> 54 </div> 55 <div class="hidden sm:ml-6 sm:flex sm:items-center"> 56 <dark-mode-toggle class="ml-2 w-10"></dark-mode-toggle> 57 </div> 58 <div class="-mr-2 flex items-center sm:hidden"> 59 <!-- Mobile menu button --> 60 <button type="button" v-on:click="open=!open" class="inline-flex items-center justify-center rounded-md bg-white dark:bg-black p-2 text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:ring-offset-black" aria-controls="mobile-menu" aria-expanded="false"> 61 <span class="sr-only">Open main menu</span> 62 <!-- Menu open: "hidden", Menu closed: "block" --> 63 <svg :class="['h-6 w-6', open ? 'hidden' : 'block']" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"> 64 <path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" /> 65 </svg> 66 <!-- Menu open: "block", Menu closed: "hidden" --> 67 <svg :class="['h-6 w-6', open ? 'block' : 'hidden']" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"> 68 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /> 69 </svg> 70 </button> 71 </div> 72 </div> 73 </div> 74 75 <!-- Mobile menu, show/hide based on menu state. --> 76 <div v-cloak v-if="open" class="sm:hidden"> 77 <div class="space-y-1 pb-3 pt-2"> 78 <!-- Current: "border-indigo-500 bg-indigo-50 text-indigo-700", Default: "border-transparent text-gray-600 hover:border-gray-300 hover:bg-gray-50 hover:text-gray-800" --> 79 <a href="/overview" class="block border-l-4 py-2 pl-3 pr-4 text-base font-medium border-transparent text-gray-600 dark:text-gray-300 hover:border-gray-300 hover:bg-gray-50 dark:hover:bg-gray-900 hover:text-gray-800 dark:hover:text-gray-100"> 80 Documentation 81 </a> 82 <a href="https://github.com/litdb/litdb/discussions" class="block border-l-4 py-2 pl-3 pr-4 text-base font-medium border-transparent text-gray-600 dark:text-gray-300 hover:border-gray-300 hover:bg-gray-50 dark:hover:bg-gray-900 hover:text-gray-800 dark:hover:text-gray-100"> 83 Discuss 84 </a> 85 <a href="https://github.com/litdb/litdb" class="block border-l-4 py-2 pl-3 pr-4 text-base font-medium border-transparent text-gray-600 dark:text-gray-300 hover:border-gray-300 hover:bg-gray-50 dark:hover:bg-gray-900 hover:text-gray-800 dark:hover:text-gray-100">
86 <span class='mr-1 text-xl'>☆</span> GitHub 87 </a> 88 </div> 89 </div> 90 </nav> 91</header> 92
93<script type="module"> 94import { ref } from "vue" 95import { mount } from "app.mjs" 96 97const Header = { 98 setup() { 99 const open = ref(false) 100 return { open } 101 } 102} 103mount('#header', Header) 104</script>
104 105 106 107<div class="min-h-screen"> 108 <main role="main" class="pt-16 pb-3"> 109 110 111 112 113<style> 114.active { 115 color: #0ea5e9 !important; 116} 117</style> 118<link rel="stylesheet" href="/css/highlight.css"> 119<link rel="stylesheet" href="/css/typography.css"> 120<link rel="stylesheet" href="/css/lite-yt-embed.css"> 121 122<div class="w-full max-w-[100rem] mx-auto"> 123 <div class="flex flex-wrap"> 124 <div id="sidebar" class="z-40 inset-0 flex-none bg-white dark:bg-black lg:w-64 xl:w-80"> 125 <button v-cloak v-on:click="open=true" :class="['text-gray-400 hover:text-gray-500 pt-4 pl-2 absolute transform transition-all duration-200', open ? 'opacity-0 translate-x-56' : 'opacity-100']" title="Open Sidebar"> 126 <svg class="w-6 h-6" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 12H10m10 0l-4 4m4-4l-4-4M4 4v16"/></svg> 127 </button> 128 <div :class="['fixed bg-white dark:bg-black h-screen overflow-y-auto scrolling-touch overflow-hidden shadow lg:shadow-none transform transition-transform duration-200', open ? '' : 'translate-x-[-100%]']"> 129 <nav class="sidebar lg:w-64 xl:w-80 px-1 pt-6 pb-16 overflow-y-auto font-medium text-sm lg:text-base sm:px-3 xl:px-5" aria-label="Sidebar"> 130 <close-button title="Close Sidebar" class="lg:hidden -mr-2" v-on:close="open=false"></close-button> 131 <a href="/" class="block flex items-center whitespace-nowrap"> 132<svg class='h-6 w-6 shrink-0 text-sky-500' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor' aria-hidden='true'><path stroke-linecap='round' stroke-linejoin='round' d='M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25'></path></svg> <span class="p-2 pl-3 font-display font-medium text-slate-900 dark:text-white"> 133Home </span> 134 </a> 135 <ul role="list" class="mb-6 mt-2 ml-3 space-y-2 border-l-2 border-slate-100 dark:border-slate-800 lg:mt-4 lg:space-y-4 lg:border-slate-200"> 136 <li class="relative"> 137 <a href="/overview" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 138 Overview 139 </a> 140 </li> 141 <li class="relative"> 142 <a href="/install" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 143 Install 144 </a> 145 </li> 146 <li class="relative"> 147 <a href="/models" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 148 Models 149 </a> 150 </li> 151 <li class="relative"> 152 <a href="/customize" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 153 Customize 154 </a> 155 </li> 156 <li class="relative"> 157 <a href="/bug-report" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 158 Report Issue 159 </a> 160 </li> 161 </ul> 162 <h2 class="font-display font-medium text-slate-900 dark:text-white whitespace-nowrap"> 163 Drivers 164 </h2> 165 <ul role="list" class="mb-6 mt-2 ml-3 space-y-2 border-l-2 border-slate-100 dar
165k:border-slate-800 lg:mt-4 lg:space-y-4 lg:border-slate-200"> 166 <li class="relative"> 167 <a href="/bun-sqlite" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 168 SQLite (Bun) 169 </a> 170 </li> 171 <li class="relative"> 172 <a href="/better-sqlite" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 173 SQLite (Node.js) 174 </a> 175 </li> 176 <li class="relative"> 177 <a href="/postgres" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full active font-semibold text-sky-500 before:bg-sky-500"> 178 PostgreSQL 179 </a> 180 </li> 181 <li class="relative"> 182 <a href="/mysql2" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 183 MySQL 184 </a> 185 </li> 186 </ul> 187 <h2 class="font-display font-medium text-slate-900 dark:text-white whitespace-nowrap"> 188 Queries 189 </h2> 190 <ul role="list" class="mb-6 mt-2 ml-3 space-y-2 border-l-2 border-slate-100 dark:border-slate-800 lg:mt-4 lg:space-y-4 lg:border-slate-200"> 191 <li class="relative"> 192 <a href="/schema" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 193 Schema 194 </a> 195 </li> 196 <li class="relative"> 197 <a href="/select" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 198 Select 199 </a> 200 </li> 201 <li class="relative"> 202 <a href="/joins" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 203 Joins 204 </a> 205 </li> 206 <li class="relative"> 207 <a href="/where" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 208 Where 209 </a> 210 </li> 211 <li class="relative"> 212 <a href="/group-by" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 213 Group By 214 </a> 215 </li> 216 <li class="relative"> 217 <a href="/having" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 218 Having 219 </a> 220 </li> 221 <li class="relative"> 222 <a href="/order-by" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 223 Order By 224 </a> 225 </li> 226 <li class="relative"> 227 <a href="/insert" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 228 Insert 229 </a> 230 </li> 231 <li class="relative"> 232 <a href="/update" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 233 Update 234 </a> 235 </li> 236 <li class="relative"> 237 <a href="/delete" class="block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"> 238 Delete 239 </a> 240 </li> 241 </ul> 242 </nav> 243 </div> 244 </div> 245 <div id="doc" class="mx-auto flex"> 246 <div class="mt-8 mx-auto prose lg:prose-lg"> 247 248 <section class="not-prose mb-16 md:mb-12"> 249 <h1 class="text-4xl tracking-tight font-extrabold text-gray-900 dark:text-gray-50 sm:text-5xl md:text-6xl"> 250 litdb for postgres.js 251 </h1> 252 </section> 253 254 <div class="not-prose"></div> 255 256 <div class="content"> 257 <p>Use litdb with <a href="https://github.com/porsager/postgres">postgres.js</a> driver:</p> 258<div class="not-prose sh-copy cp flex cursor-pointer mb-3" onclick="copy(this)"> 259 <div class="flex-grow bg-gray-800"> 260 <div class="pl-4 py-1 pb-1.5 align-middle whitespace-pre text-base text-gray-100"><p>npm install @litdb/postgres</p> 261</div> 262 </div> 263 <div class="flex"> 264 <div class="bg-green-600 text-white p-1.5 pb-0"> 265 <svg class="copied w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg> 266 <svg class="nocopy w-6 h-6" title="copy" fill='none' stroke='white' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'> 267 <path stroke-linecap='round' stroke-linejoin='round' stroke-width='1' d='M8 7v8a2 2 0 002 2h6M8 7V5a2 2 0 012-2h4.586a1 1 0 01.707.293l4.414 4.414a1 1 0 01.293.707V15a2 2 0 01-2 2h-2M8 7H6a2 2 0 00-2 2v10a2 2 0 002 2h8a2 2 0 002-2v-2'></path> 268 </svg> 269 </div> 270 </div> 271 </div> 272<h2 id="configuration">Configuration<a class="header-anchor" href="javascript:;" onclick="location.hash='#configuration'" aria-label="Permalink">​</a></h2> 273<p><strong>db.ts</strong></p> 274<pre><code class="language-ts">import { connect } from "@litdb/postgres" 275 276export const connection = connect({ hostname, database, user, password }) 277export const { $, async:db, native:sql } = connection 278</code></pre> 279<div class="tip custom-block"> 280 <p class="custom-block-title">TIP</p><p>When needed use <code>sql</code> to access the native <a href="https://github.com/porsager/postgres#usage">
280postgres.js sql function</a></p> 281</div> 282<h3 id="configuration-options">Configuration Options<a class="header-anchor" href="javascript:;" onclick="location.hash='#configuration-options'" aria-label="Permalink">​</a></h3> 283<pre><code class="language-ts">type ConnectionOptions = { 284 /** Postgres ip address[s] or domain name[s] */ 285 host?: string | undefined; 286 /** Postgres server[s] port[s] */ 287 port?: number | undefined; 288 /** unix socket path (usually '/tmp') */ 289 path?: string | undefined; 290 /** Password of database user (an alias for `password`) */ 291 pass?: Options<T>['password'] | undefined; 292 /** 293 * Password of database user 294 * @default process.env['PGPASSWORD'] 295 */ 296 password?: string | (() => string | Promise<string>) | undefined; 297 /** Name of database to connect to (an alias for `database`) */ 298 db?: Options<T>['database'] | undefined; 299 /** Username of database user (an alias for `user`) */ 300 username?: Options<T>['user'] | undefined; 301 /** Postgres ip address or domain name (an alias for `host`) */ 302 hostname?: Options<T>['host'] | undefined; 303 /** 304 * Disable prepared mode 305 * @deprecated use "prepare" option instead 306 */ 307 no_prepare?: boolean | undefined; 308 /** 309 * Idle connection timeout in seconds 310 * @deprecated use "idle_timeout" option instead 311 */ 312 timeout?: Options<T>['idle_timeout'] | undefined; 313} 314</code></pre> 315<p>See <a href="https://github.com/porsager/postgres?tab=readme-ov-file#connection-details">postgres.js Connection Options</a> for more.</p> 316<p>Example:</p> 317<pre><code class="language-ts">connection = connect({ hostname, database, user, password }) 318connection = connect(connectionString, options) 319</code></pre> 320<h2 id="usage">Usage<a class="header-anchor" href="javascript:;" onclick="location.hash='#usage'" aria-label="Permalink">​</a></h2> 321<p>Example of using <code>@litdb/postgres</code> async APIs:</p> 322<pre><code class="language-ts">import { $, db } from "./db" 323import { Contact } from "./models" 324 325await db.dropTable(Contact) 326await db.createTable(Contact) 327await db.insertAll([ 328 new Contact({ name:"John Doe", email:"<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7913161117391418101557160b1e">[email protected]</a>" }), 329 new Contact({ name:"Jane Doe", email:"<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7f151e111a3f121e161351100d18">[email protected]</a>" }), 330]) 331 332const janeEmail = '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8fe5eee1eacfe2eee6e3a1e0fde8">[email protected]</a>' 333const jane = await db.one<Contact>($.from(Contact).where(c => $`${c.email}=${janeEmail}`)) 334 335// Insert examples 336const { lastInsertRowid:bobId } = await db.insert( 337 new Contact({ name:"Bob", email:"<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="67050805270a060e0b49081500">[email protected]</a>"})) 338 339const { lastInsertRowid } = await db.exec 340 `INSERT INTO Contact(name,email) VALUES('Jo','<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8fe5e0cfebe0eaa1e0fde8">[email protected]</a>')` 341 342const name = 'Alice', email = '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fa9b9693999fba979b9396d495889d">[email protected]</a>' 343await db.exec`INSERT INTO Contact(name,email) VALUES (${name}, ${email})` 344 345// Typed SQL fragment with named param example 346const hasId = <Table extends { id:number }>(id:number|bigint) => 347 (x:Table) => $.sql($`${x.id} = $id`, { id }) 348 349const contacts = await db.all($.from(Contact).into(Contact)) // => Contact[] 350const bob = await db.one($.from(Contact).where(hasId(bobId)).into(Contact)) // => Contact 351const contactsCount = await db.value($.from(Contact).rowCount()) // => number 352const emails = await db.column($.from(Contact).select(c => $`${c.email}`)) // => string[] 353const contactsArray = await db.arrays($.from(Contact)) // => any[][] 354const bobArray = await db.array($.from(Contact).where(hasId(bobId))) // => any[] 355 356// Update examples 357jane.email = '<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c9a3a8a7ac89ada6ace7a6bbae">[email protected]</a>' 358await db.update(jane) // Update all properties 359await db.update(jane, { onlyProps:['email'] }) // Update only email 360// query builder 361await db.exec($.update(Contact).set({ email:jane.email }).where(hasId(jane.id))) 362 363// Delete examples 364await db.delete(jane) 365await db.exec($.deleteFrom(Contact).where(hasId(jane.id))) // query builder 366</code></pre> 367 368 </div> 369 370 <div class="not-prose"></div> 371 372 <div class="not-prose py-8"> 373 <a class="text-slate-500 font-semibold hover:text-indigo-600 flex items-center" href="https://github.com/litdb/litdb.dev/blob/main/MyApp/_pages/postgres.md" target="_blank" rel="noopener noreferrer"> 374 Edit this page on GitHub<svg class="ml-1 inline-block w-4 h-4" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" data-v-1ed99556="">
374<path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> 375 </a> 376 </div> 377 378 <div class="not-prose my-20"> 379 <nav class="flex items-center justify-between border-t border-gray-200 dark:border-gray-700 px-4 sm:px-0"> 380 <div class="-mt-px flex w-0 flex-1"> 381 <a href="/better-sqlite" class="inline-flex items-center border-t-2 border-transparent pt-4 pr-1 text-sm font-medium text-gray-500 hover:border-gray-300 dark:hover:border-gray-600 hover:text-gray-700 dark:hover:text-gray-200"> 382 <!-- Heroicon name: mini/arrow-long-left --> 383 <svg class="mr-3 h-5 w-5 text-gray-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> 384 <path fill-rule="evenodd" d="M18 10a.75.75 0 01-.75.75H4.66l2.1 1.95a.75.75 0 11-1.02 1.1l-3.5-3.25a.75.75 0 010-1.1l3.5-3.25a.75.75 0 111.02 1.1l-2.1 1.95h12.59A.75.75 0 0118 10z" clip-rule="evenodd"></path> 385 </svg> 386 SQLite (Node.js) 387 </a> 388 </div> 389 <div class="hidden md:-mt-px md:flex"></div> 390 <div class="-mt-px flex w-0 flex-1 justify-end"> 391 <a href="/mysql2" class="inline-flex items-center border-t-2 border-transparent pt-4 pl-1 text-sm font-medium text-gray-500 hover:border-gray-300 dark:hover:border-gray-600 hover:text-gray-700 dark:hover:text-gray-200"> 392 MySQL 393 <!-- Heroicon name: mini/arrow-long-right --> 394 <svg class="ml-3 h-5 w-5 text-gray-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> 395 <path fill-rule="evenodd" d="M2 10a.75.75 0 01.75-.75h12.59l-2.1-1.95a.75.75 0 111.02-1.1l3.5 3.25a.75.75 0 010 1.1l-3.5 3.25a.75.75 0 11-1.02-1.1l2.1-1.95H2.75A.75.75 0 012 10z" clip-rule="evenodd"></path> 396 </svg> 397 </a> 398 </div> 399 </nav> 400 </div> 401 </div> 402 403 <div class="docmap hidden 2xl:block flex-none w-64 pl-8 mr-8"> 404 <div class="fixed bg-white dark:bg-black flex flex-col overflow-y-auto pt-10 px-8 pb-6" style="height:calc(100vh - 50px);"> 405 <div> 406 <h5 class="text-slate-900 font-semibold mb-4 text-sm leading-6 dark:text-slate-100"> 407 On This Page 408 </h5> 409 <ul class="text-slate-700 text-sm leading-6"> 410 <li class="group text-gray-800 hover:text-gray-900"> 411 <span v-hash="'#configuration'" data-id="configuration" class="cursor-pointer font-medium block text-sm transform transition-colors duration-200 py-2"> 412 Configuration 413 </span> 414 <ul class="ml-4"> 415 <li data-id="configuration-options" class="text-gray-500 hover:text-gray-900"> 416 <span v-hash="'#configuration-options'" class="cursor-pointer flex text-sm transform transition-colors duration-200 py-2"> 417 <svg width="3" height="24" viewBox="0 -9 3 24" class="mr-2 overflow-visible"><path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></path></svg> 418 Configuration Options 419 </span> 420 </li> 421 </ul> 422 </li> 423 <li class="group text-gray-800 hover:text-gray-900">
424 <span v-hash="'#usage'" data-id="usage" class="cursor-pointer font-medium block text-sm transform transition-colors duration-200 py-2"> 425 Usage 426 </span> 427 </li> 428 </ul> 429 </div> 430 </div> 431 </div> 432 433 </div> 434 </div> 435</div> 436 437<link rel="stylesheet" href="/codemirror/lib/codemirror.css"> 438<link rel="stylesheet" href="/codemirror/theme/mocha.css" />
vendor: 109 bytes, lines 438-439
438 439<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
439<script src="/codemirror/lib/codemirror.js"></script>
vendor: 1 bytes, line 439
439
440<script src="/codemirror/mode/javascript/javascript.js"></script>
vendor: 1 bytes, line 440
440
441<script src="/codemirror/addon/edit/matchbrackets.js"></script>
vendor: 1 bytes, line 441
441
442<script src="/codemirror/addon/selection/active-line.js"></script>
442 443 444
445<script> 446//doc instructions 447if (document.querySelector('.hide-title')) { 448 const el = document.querySelector('#doc section h1') 449 if (el) el.style.display='none' 450} 451</script>
451 452
453<script type="module"> 454import { ref } from "vue" 455import { mount } from "app.mjs" 456 457 458 const App = { 459 setup() { 460 function nav(url) { 461 window.open(url) 462 } 463 return { nav } 464 } 465 } 466 467const Sidebar = { 468 setup() { 469 const open = ref(true) 470 return { open } 471 } 472} 473 474mount('#doc', App) 475mount('#sidebar', Sidebar) 476</script>
476 477
478<script src="/lib/js/highlight.js"></script>
vendor: 1 bytes, line 478
478
479<script>hljs.highlightAll()</script>
vendor: 1 bytes, line 479
479
480<script src="/lib/js/lite-yt-embed.js"></script>
vendor: 1 bytes, line 480
480
481<script src="/mjs/docs.mjs" type="module"></script>
481 482 483 484 </main> 485</div> 486 487 488
489<script type="module"> 490import { init } from "app.mjs" 491init() 492</script>
492 493 494 495
496<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"7e8f6dc0989e492b9da04c4710092d07","r":1,"spa":2}' crossorigin="anonymous"></script>
496 497</body> 498</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.