Skip to content

Commit 0f8accd

Browse files
chore: apply automated updates
1 parent 6558263 commit 0f8accd

1 file changed

File tree

examples/database/README.md

-12 KB
# Database > Built-in database support with SQL template literals. <!-- automd:ui-code-tree src="." default="server.ts" ignore="README.md,GUIDE.md" expandAll --> ::code-tree{defaultValue="server.ts" expandAll} ```ts [nitro.config.ts] import { defineConfig } from "nitro"; export default defineConfig({ experimental: { database: true, tasks: true, }, database: { default: { connector: "sqlite" }, }, }); ``` ```json [package.json] { "type": "module", "scripts": { "dev": "nitro dev", "build": "nitro build" }, "devDependencies": { "nitro": "latest" } } ``` ```ts [server.ts] import { defineHandler } from "nitro/h3"; import { useDatabase } from "nitro/database"; export default defineHandler(async () => { const db = useDatabase(); // Create users table await db.sql`DROP TABLE IF EXISTS users`; await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`; // Add a new user const userId = String(Math.round(Math.random() * 10_000)); await db.sql`INSERT INTO users VALUES (${userId}, 'John', 'Doe', '')`; // Query for users const { rows } = await db.sql`SELECT * FROM users WHERE id = ${userId}`; return { rows, }; }); ``` ```json [tsconfig.json] { "extends": "nitro/tsconfig" } ``` ```ts [vite.config.ts] import { defineConfig } from "vite"; import { nitro } from "nitro/vite"; export default defineConfig({ plugins: [nitro()] }); ``` ```text [.data/db.sqlite] SQLite format 3���@ ������.�� ����Y�Y��r�������Ctableusersusers�CREATE TABLE users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT))���=��indexsqlite_autoindex_users_1users�� ����������� 2550JohnDoe ��������� 2550 ``` ```ts [tasks/db/migrate.ts] import { defineTask } from "nitro/task"; import { useDatabase } from "nitro/database"; export default defineTask({ meta: { description: "Run database migrations", }, async run() { const db = useDatabase(); console.log("Running database migrations..."); // Create users table await db.sql`DROP TABLE IF EXISTS users`; await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`; return { result: "Database migrations complete!", }; }, }); ``` :: <!-- /automd --> <!-- automd:file src="GUIDE.md" --> Nitro provides a built-in database layer that uses SQL template literals for safe, parameterized queries. This example creates a users table, inserts a record, and queries it back. ## Querying the Database ```ts [server.ts] import { defineHandler } from "nitro/h3"; import { useDatabase } from "nitro/database"; export default defineHandler(async () => { const db = useDatabase(); // Create users table await db.sql`DROP TABLE IF EXISTS users`; await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`; // Add a new user const userId = String(Math.round(Math.random() * 10_000)); await db.sql`INSERT INTO users VALUES (${userId}, 'John', 'Doe', '')`; // Query for users const { rows } = await db.sql`SELECT * FROM users WHERE id = ${userId}`; return { rows, }; }); ``` Retrieve the database instance using `useDatabase()`. The database can be queried using `db.sql`, and variables like `${userId}` are automatically escaped to prevent SQL injection. ## Running Migrations with Tasks Nitro tasks let you run operations outside of request handlers. For database migrations, create a task file in `tasks/` and run it via the CLI. This keeps schema changes separate from your application code. ```ts [tasks/db/migrate.ts] import { defineTask } from "nitro/task"; import { useDatabase } from "nitro/database"; export default defineTask({ meta: { description: "Run database migrations", }, async run() { const db = useDatabase(); console.log("Running database migrations..."); // Create users table await db.sql`DROP TABLE IF EXISTS users`; await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`; return { result: "Database migrations complete!", }; }, }); ``` <!-- /automd --> ## Learn More - [Database](/docs/database) - [Tasks](/docs/tasks)

Database

Built-in database support with SQL template literals.

::code-tree{defaultValue="server.ts" expandAll}

import { defineConfig } from "nitro";

export default defineConfig({
  experimental: {
    database: true,
    tasks: true,
  },
  database: {
    default: { connector: "sqlite" },
  },
});
{
  "type": "module",
  "scripts": {
    "dev": "nitro dev",
    "build": "nitro build"
  },
  "devDependencies": {
    "nitro": "latest"
  }
}
import { defineHandler } from "nitro/h3";
import { useDatabase } from "nitro/database";

export default defineHandler(async () => {
  const db = useDatabase();

  // Create users table
  await db.sql`DROP TABLE IF EXISTS users`;
  await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`;

  // Add a new user
  const userId = String(Math.round(Math.random() * 10_000));
  await db.sql`INSERT INTO users VALUES (${userId}, 'John', 'Doe', '')`;

  // Query for users
  const { rows } = await db.sql`SELECT * FROM users WHERE id = ${userId}`;

  return {
    rows,
  };
});
{
  "extends": "nitro/tsconfig"
}
import { defineConfig } from "vite";
import { nitro } from "nitro/vite";

export default defineConfig({ plugins: [nitro()] });
import { defineTask } from "nitro/task";
import { useDatabase } from "nitro/database";

export default defineTask({
  meta: {
    description: "Run database migrations",
  },
  async run() {
    const db = useDatabase();

    console.log("Running database migrations...");

    // Create users table
    await db.sql`DROP TABLE IF EXISTS users`;
    await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`;

    return {
      result: "Database migrations complete!",
    };
  },
});

::

Nitro provides a built-in database layer that uses SQL template literals for safe, parameterized queries. This example creates a users table, inserts a record, and queries it back.

Querying the Database

import { defineHandler } from "nitro/h3";
import { useDatabase } from "nitro/database";

export default defineHandler(async () => {
  const db = useDatabase();

  // Create users table
  await db.sql`DROP TABLE IF EXISTS users`;
  await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`;

  // Add a new user
  const userId = String(Math.round(Math.random() * 10_000));
  await db.sql`INSERT INTO users VALUES (${userId}, 'John', 'Doe', '')`;

  // Query for users
  const { rows } = await db.sql`SELECT * FROM users WHERE id = ${userId}`;

  return {
    rows,
  };
});

Retrieve the database instance using useDatabase(). The database can be queried using db.sql, and variables like ${userId} are automatically escaped to prevent SQL injection.

Running Migrations with Tasks

Nitro tasks let you run operations outside of request handlers. For database migrations, create a task file in tasks/ and run it via the CLI. This keeps schema changes separate from your application code.

import { defineTask } from "nitro/task";
import { useDatabase } from "nitro/database";

export default defineTask({
  meta: {
    description: "Run database migrations",
  },
  async run() {
    const db = useDatabase();

    console.log("Running database migrations...");

    // Create users table
    await db.sql`DROP TABLE IF EXISTS users`;
    await db.sql`CREATE TABLE IF NOT EXISTS users ("id" TEXT PRIMARY KEY, "firstName" TEXT, "lastName" TEXT, "email" TEXT)`;

    return {
      result: "Database migrations complete!",
    };
  },
});

Learn More

0 commit comments

Comments
 (0)