Database Adapters

@websideproject/nuxt-auto-api supports multiple database engines through a unified adapter layer. Each adapter normalizes engine-specific behavior like transactions, batch operations, and mutation count parsing.

Database Adapters

@websideproject/nuxt-auto-api supports multiple database engines through a unified adapter layer. Each adapter normalizes engine-specific behavior like transactions, batch operations, and mutation count parsing.

Supported Engines

EnginePackageTransactionsReturningNative Batch
better-sqlite3better-sqlite3db.transaction()YesNo
postgrespg / postgresdb.transaction()YesNo
mysqlmysql2db.transaction()NoNo
d1Cloudflare D1db.batch()YesYes
turso@libsql/clientdb.batch()YesYes
planetscale@planetscale/databasedb.transaction()NoNo

Setup

Using initializeDatabase

The recommended way to initialize the database is with initializeDatabase() in a server plugin:

// server/plugins/database.ts
import { drizzle } from 'drizzle-orm/better-sqlite3'
import Database from 'better-sqlite3'
import { initializeDatabase } from '@websideproject/nuxt-auto-api/database'
import * as schema from '../database/schema'

export default defineNitroPlugin(() => {
  const sqlite = new Database('sqlite.db')
  const db = drizzle(sqlite, { schema })

  initializeDatabase(db, 'better-sqlite3')
})

Postgres

import { drizzle } from 'drizzle-orm/node-postgres'
import { Pool } from 'pg'
import { initializeDatabase } from '@websideproject/nuxt-auto-api/database'

export default defineNitroPlugin(() => {
  const pool = new Pool({ connectionString: process.env.DATABASE_URL })
  const db = drizzle(pool, { schema })

  initializeDatabase(db, 'postgres')
})

Cloudflare D1

import { drizzle } from 'drizzle-orm/d1'
import { initializeDatabase } from '@websideproject/nuxt-auto-api/database'

export default defineNitroPlugin(() => {
  const db = drizzle(env.DB, { schema })

  initializeDatabase(db, 'd1')
})

Turso / LibSQL

import { drizzle } from 'drizzle-orm/libsql'
import { createClient } from '@libsql/client'
import { initializeDatabase } from '@websideproject/nuxt-auto-api/database'

export default defineNitroPlugin(() => {
  const client = createClient({
    url: process.env.TURSO_DATABASE_URL!,
    authToken: process.env.TURSO_AUTH_TOKEN,
  })
  const db = drizzle(client, { schema })

  initializeDatabase(db, 'turso')
})

Configuration

Set the engine in nuxt.config.ts:

export default defineNuxtConfig({
  autoApi: {
    database: {
      client: 'better-sqlite3', // or 'postgres', 'mysql', 'd1', 'turso', 'planetscale'
    },
  },
})

Using the Adapter Directly

The adapter is available in HandlerContext and from the getDatabaseAdapter() helper:

import { getDatabaseAdapter } from '@websideproject/nuxt-auto-api/database'

// In a server handler
const adapter = getDatabaseAdapter()

// Run atomic operations (transaction or batch depending on engine)
const result = await adapter.atomic(async ({ tx }) => {
  await tx.insert(users).values({ name: 'Alice' })
  await tx.insert(posts).values({ title: 'Hello', userId: 1 })
  return 'done'
})

// Check engine capabilities
if (adapter.supportsReturning) {
  const [created] = await db.insert(users).values(data).returning()
}

// Parse mutation counts
const result = await db.delete(posts).where(eq(posts.draft, true))
const deleted = adapter.getMutationCount(result)

Adapter API

interface DatabaseAdapter {
  engine: DatabaseEngine       // Engine identifier
  db: any                      // Drizzle database instance
  atomic<T>(fn): Promise<T>    // Run operations atomically
  getMutationCount(result): number  // Parse affected rows
  supportsReturning: boolean   // Does the engine support RETURNING?
  supportsNativeBatch: boolean // Does the engine use batch() instead of transaction()?
}

Backward Compatibility

If you are using the legacy globalThis.__autoApiDb pattern, it still works. The system will automatically wrap it in a default SQLite adapter with a deprecation warning. To silence the warning, switch to initializeDatabase().

// Legacy (still works, deprecated)
globalThis.__autoApiDb = db

// Recommended
initializeDatabase(db, 'better-sqlite3')

Need a Landing Page?

Modern landing pages with optional modules (blog, docs, forms, i18n). Let's discuss your project.

Build Your MVP

Full-stack SaaS development. Expert in database design, multi-tenancy, and scalable architecture.

Deployment Help

Dockerize your backend, set up CI/CD pipelines, deploy to Cloudflare or Hetzner. Early-stage setup.

Suggest a SaaS Tool

Missing a calculator or tool? Suggest what you'd like to see on our site.