ZetCode

Python sqlite3.sqlite_version Attribute

Last modified April 15, 2025

This comprehensive guide explores Python's sqlite3.sqlite_version attribute, which provides the version of the underlying SQLite library. We'll cover its usage, importance, and practical examples.

Basic Definitions

The sqlite3.sqlite_version is a string attribute that contains the runtime version of the SQLite library. It's different from the version of the Python sqlite3 module itself.

This attribute is read-only and available without establishing a database connection. It's useful for checking feature availability and compatibility.

Basic Version Check

Here's the simplest usage of sqlite3.sqlite_version to check the SQLite library version being used by Python.

basic_version.py
import sqlite3

# Print the SQLite library version
print(f"SQLite version: {sqlite3.sqlite_version}")

# Compare with compile-time version
print(f"Compile-time version: {sqlite3.sqlite_version_info}")

This example shows how to access both the string version and the version info tuple. The tuple makes version comparisons easier in code.

The version follows the format "X.Y.Z" where X is major, Y is minor, and Z is patch level. The info tuple contains these as integers.

Checking Feature Availability

You can use the version to check if specific SQLite features are available before using them.

feature_check.py
import sqlite3
from packaging import version

def supports_window_functions():
    return version.parse(sqlite3.sqlite_version) >= version.parse("3.25.0")

if supports_window_functions():
    print("Window functions are supported")
else:
    print("Window functions not supported - upgrade SQLite")

This example checks if window functions (introduced in SQLite 3.25.0) are available. The packaging.version module helps with version comparisons.

Always verify feature support when writing code that might run on different systems with varying SQLite versions.

Database Connection with Version Check

You can verify the SQLite version matches your requirements before performing database operations.

connection_version.py
import sqlite3

MIN_VERSION = (3, 35, 0)  # Requires SQLite 3.35.0 or higher

if sqlite3.sqlite_version_info < MIN_VERSION:
    raise RuntimeError(
        f"SQLite {'.'.join(map(str, MIN_VERSION))} or higher required"
    )

with sqlite3.connect(":memory:") as conn:
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE test (id INTEGER PRIMARY KEY)")
    print("Database operations successful")

This example enforces a minimum SQLite version before proceeding with database operations. The version check happens before any connection is established.

This pattern is useful when your application depends on specific SQLite features introduced in certain versions.

Version-Specific SQL Execution

You can write SQL that adapts to the available SQLite version.

version_specific_sql.py
import sqlite3

with sqlite3.connect(":memory:") as conn:
    cursor = conn.cursor()
    
    # Use STRICT tables if available (SQLite 3.37.0+)
    if sqlite3.sqlite_version_info >= (3, 37, 0):
        cursor.execute("CREATE TABLE data (id INTEGER, name TEXT) STRICT")
    else:
        cursor.execute("CREATE TABLE data (id INTEGER, name TEXT)")
    
    print("Table created with appropriate schema")

This example creates a table with STRICT mode if available, falling back to a regular table otherwise. STRICT tables provide better type checking.

Adapting your SQL to the available version helps maintain compatibility while using newer features when possible.

Comparing with sqlite_version

The sqlite3.sqlite_version differs from sqlite3.version and sqlite3.version_info. Here's how to compare them.

version_comparison.py
import sqlite3

print(f"SQLite library version (runtime): {sqlite3.sqlite_version}")
print(f"SQLite library version info: {sqlite3.sqlite_version_info}")
print(f"sqlite3 module version: {sqlite3.version}")
print(f"sqlite3 module version info: {sqlite3.version_info}")

with sqlite3.connect(":memory:") as conn:
    cursor = conn.cursor()
    cursor.execute("SELECT sqlite_version()")
    print(f"SQLite version from database: {cursor.fetchone()[0]}")

This example shows all version-related attributes and a database query. The sqlite_version function returns the same as the attribute.

The module version refers to the Python sqlite3 interface, while sqlite_version refers to the underlying C library.

Logging SQLite Version

For debugging and support purposes, it's good practice to log the SQLite version.

version_logging.py
import sqlite3
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def init_database():
    logger.info(f"Using SQLite version {sqlite3.sqlite_version}")
    
    with sqlite3.connect("app.db") as conn:
        cursor = conn.cursor()
        # Database initialization code here
        logger.info("Database initialized successfully")

if __name__ == "__main__":
    init_database()

This example demonstrates logging the SQLite version during application startup. This information is valuable for troubleshooting compatibility issues.

Including the SQLite version in logs helps when users report issues, as behavior might differ between versions.

Best Practices

Source References

Author

My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.

List all Python tutorials.