ScriptsSep 12, 2026·3 min read

go-sqlite3 — SQLite3 Driver for Go via cgo

A cgo-based SQLite3 driver that implements Go's standard database/sql interface, enabling Go applications to use SQLite with familiar query patterns.

Agent ready

Ready-to-run agent install

This asset can be installed after the agent chooses its runtime, checks the plan, and runs the matching command.

Native · 98/100Policy: allow
Agent surface
Any MCP/CLI agent
Kind
Skill
Install
Single
Trust
Trust: Established
Entrypoint
go-sqlite3
Direct install command
npx -y tokrepo@latest install 26cef45b-aeaa-11f1-9bc6-00163e2b0d79 --target codex

Run after dry-run confirms the install plan.

Introduction

go-sqlite3 is a cgo-based SQLite3 driver for Go that conforms to the standard database/sql interface. It lets Go developers work with SQLite databases using the same query API they would use for PostgreSQL or MySQL, keeping SQLite as a lightweight embedded option for applications that do not need a separate server.

What go-sqlite3 Does

  • Implements the database/sql/driver interface for SQLite3
  • Supports prepared statements, transactions, and context-based cancellation
  • Allows registering custom SQL functions, aggregators, and collations in Go
  • Provides access to SQLite extensions and compile-time options
  • Handles concurrent reads with WAL mode and serialized threading

Architecture Overview

go-sqlite3 wraps the SQLite C library using cgo. When imported, it registers itself with Go's database/sql package under the driver name "sqlite3". All SQL operations pass through cgo to the embedded SQLite engine, which reads and writes directly to a local file. Connections are managed by the sql.DB connection pool, and the driver maps Go types to SQLite storage classes.

Self-Hosting & Configuration

  • Requires a C compiler (gcc or clang) on the build machine due to cgo
  • Set CGO_ENABLED=1 before building; cross-compilation needs a matching C cross-compiler
  • Pass SQLite pragma options via the DSN: "file:app.db?_journal_mode=WAL&_busy_timeout=5000"
  • Enable or disable SQLite extensions at compile time using build tags
  • Use the _loc parameter to control timezone handling for datetime values

Key Features

  • Full database/sql compatibility for idiomatic Go usage
  • Custom function registration for domain-specific SQL logic
  • Support for SQLite's backup API to copy databases while in use
  • FTS5 full-text search and JSON1 extension support via build tags
  • Connection hooks for tracing, profiling, and authorization callbacks

Comparison with Similar Tools

  • modernc.org/sqlite — pure Go, no cgo; go-sqlite3 is faster but requires a C compiler
  • crawshaw.io/sqlite — low-level SQLite bindings; go-sqlite3 integrates with database/sql
  • GORM + SQLite — ORM layer on top; go-sqlite3 is the underlying driver GORM uses
  • pgx (PostgreSQL) — server-based driver; go-sqlite3 is embedded and file-based
  • go-duckdb — analytical queries; go-sqlite3 is for transactional and general-purpose use

FAQ

Q: Why does go-sqlite3 require cgo? A: It links against the C implementation of SQLite for full compatibility and performance. If you cannot use cgo, consider modernc.org/sqlite as a pure-Go alternative.

Q: Is go-sqlite3 safe for concurrent use? A: Yes. With WAL journal mode enabled, multiple goroutines can read concurrently while one writes. The sql.DB pool manages connection reuse.

Q: Can I use go-sqlite3 in a Docker container? A: Yes. Include gcc and the SQLite development headers in your build stage. Alpine-based images need musl-dev and gcc installed.

Q: How do I enable full-text search? A: Build with the tag: go build -tags "fts5". This compiles SQLite with FTS5 support.

Sources

Discussion

Sign in to join the discussion.
No comments yet. Be the first to share your thoughts.

Related Assets