The old intro recommended django-mongodb-backend, which the 2026-10-02 audit moved to the ORM section. Co-Authored-By: Claude <noreply@anthropic.com>
4.7 KiB
Each database calls for a Python database driver built for it. Reach PostgreSQL through Psycopg, and MySQL through mysqlclient. sqlite3 comes with Python.
How to choose:
- PostgreSQL, from sync or async code: Psycopg
- MySQL or MariaDB, Django projects included: mysqlclient
- SQLite with nothing to install: sqlite3
- MySQL in pure Python: PyMySQL
- An asyncio-only PostgreSQL service: asyncpg
- Loading JSON or CSV into SQLite, from Python or the shell: sqlite-utils
- ClickHouse, even behind proxies and load balancers: clickhouse-connect
- ClickHouse over its native TCP protocol: clickhouse-driver
- Any database with an ODBC driver: pyodbc
- Oracle Database: python-oracledb
- SQL Server or Azure SQL, with no driver manager to set up: mssql-python
- Redis, MongoDB, or Apache Cassandra: redis-py, PyMongo, or cassandra-driver
Psycopg is the PostgreSQL driver Django recommends. One design serves sync and async code: AsyncConnection and AsyncCursor mirror the sync classes, so you mostly add await. Open each connection in a with block. It commits when the block ends, rolls back on an exception, and closes the connection either way.
asyncpg is built for asyncio only, and skips DB-API on purpose to fit PostgreSQL better. In a server, create a pool with asyncpg.create_pool() at startup, then take a connection per request with async with pool.acquire().
Django calls mysqlclient the recommended choice for MySQL, and ships its own adapter for it. It's a native driver built against MySQL's client library. Where you can't install that library and its headers, use PyMySQL, which SQLAlchemy calls a pure Python port of MySQLdb that targets full compatibility. The licenses differ too: mysqlclient is GPL, and PyMySQL is MIT.
sqlite3 comes with Python, and SQLite needs no server. Use the connection as a context manager: it commits when the block succeeds and rolls back when it raises.
sqlite-utils sits on top of sqlite3 to create and fill databases, not to be a full ORM. Pass insert_all() a list of dicts, and it creates the table and columns for you. Its command-line tool pipes JSON or CSV straight into a new database file.
clickhouse-connect is ClickHouse's official client and talks HTTP, so it works through load balancers, proxies, and enterprise network controls. clickhouse-driver uses the native TCP protocol instead, which its docs say is more configurable and sends compact binary data.
pyodbc reaches any database through that database's ODBC driver, plus one driver manager for all of them. Windows has one built in; on macOS and Unix, you install one first. For SQL Server and Azure SQL, Microsoft's own mssql-python connects without an external driver manager.
python-oracledb is Oracle's official driver. In its default Thin mode, it connects straight to Oracle Database without Oracle Client libraries.
redis-py is the Python client for Redis, and MongoDB's docs call PyMongo the recommended way to work with MongoDB from Python. cassandra-driver talks to Apache Cassandra over Cassandra's binary protocol, with sync and async APIs.
With any SQL database, pass values as query parameters instead of formatting them into the SQL string. The sqlite3 docs say this avoids SQL injection. For more per database, see awesome-mysql, awesome-postgres, and awesome-sqlite.