Skip to main content
The sqlite3 module provides a SQL database interface compatible with SQLite.

Module Import

import sqlite3

Basic Usage

Connect to Database

import sqlite3

# Connect to file
conn = sqlite3.connect('database.db')

# In-memory database
conn = sqlite3.connect(':memory:')

# Always close when done
conn.close()

# Or use context manager
with sqlite3.connect('database.db') as conn:
    # Work with database
    pass

Create Table

import sqlite3

conn = sqlite3.connect('database.db')
cursor = conn.cursor()

# Create table
cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT UNIQUE,
        age INTEGER
    )
''')

conn.commit()
conn.close()

Insert Data

import sqlite3

conn = sqlite3.connect('database.db')
cursor = conn.cursor()

# Insert single row
cursor.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
               ('Alice', '[email protected]', 30))

# Insert multiple rows
users = [
    ('Bob', '[email protected]', 25),
    ('Charlie', '[email protected]', 35),
]
cursor.executemany("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", users)

conn.commit()
conn.close()

Query Data

import sqlite3

conn = sqlite3.connect('database.db')
cursor = conn.cursor()

# Fetch all results
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
    print(row)

# Fetch one row
cursor.execute("SELECT * FROM users WHERE age > ?", (25,))
row = cursor.fetchone()
print(row)

# Iterate over results
cursor.execute("SELECT name, email FROM users")
for name, email in cursor:
    print(f"{name}: {email}")

conn.close()

Update and Delete

import sqlite3

conn = sqlite3.connect('database.db')
cursor = conn.cursor()

# Update
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (31, 'Alice'))

# Delete
cursor.execute("DELETE FROM users WHERE age < ?", (20,))

conn.commit()
print(f"Rows affected: {cursor.rowcount}")
conn.close()

Row Factories

import sqlite3

# Return rows as dictionaries
conn = sqlite3.connect('database.db')
conn.row_factory = sqlite3.Row

cursor = conn.cursor()
cursor.execute("SELECT * FROM users")

for row in cursor:
    print(f"Name: {row['name']}, Email: {row['email']}")
    print(dict(row))  # Convert to dict

conn.close()

Practical Examples

Simple CRUD Operations

import sqlite3

class UserDatabase:
    def __init__(self, db_file):
        self.conn = sqlite3.connect(db_file)
        self.conn.row_factory = sqlite3.Row
        self.create_table()
    
    def create_table(self):
        cursor = self.conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS users (
                id INTEGER PRIMARY KEY,
                name TEXT NOT NULL,
                email TEXT UNIQUE
            )
        ''')
        self.conn.commit()
    
    def add_user(self, name, email):
        cursor = self.conn.cursor()
        cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)",
                      (name, email))
        self.conn.commit()
        return cursor.lastrowid
    
    def get_user(self, user_id):
        cursor = self.conn.cursor()
        cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
        return cursor.fetchone()
    
    def update_user(self, user_id, name=None, email=None):
        if name:
            self.conn.execute("UPDATE users SET name = ? WHERE id = ?",
                            (name, user_id))
        if email:
            self.conn.execute("UPDATE users SET email = ? WHERE id = ?",
                            (email, user_id))
        self.conn.commit()
    
    def delete_user(self, user_id):
        self.conn.execute("DELETE FROM users WHERE id = ?", (user_id,))
        self.conn.commit()
    
    def close(self):
        self.conn.close()

# Usage
db = UserDatabase('users.db')
user_id = db.add_user('Alice', '[email protected]')
user = db.get_user(user_id)
print(dict(user))
db.close()

Transaction Management

import sqlite3

conn = sqlite3.connect('database.db')

try:
    cursor = conn.cursor()
    
    # Multiple operations in transaction
    cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)",
                  ('Alice', '[email protected]'))
    cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)",
                  ('Bob', '[email protected]'))
    
    conn.commit()
    print("Transaction committed")
    
except sqlite3.Error as e:
    conn.rollback()
    print(f"Transaction rolled back: {e}")
    
finally:
    conn.close()
Always use parameterized queries (? placeholders) to prevent SQL injection.
Remember to commit changes with conn.commit() or they will be lost.

pickle

Python object serialization

json

JSON encoding/decoding

Build docs developers (and LLMs) love