isqlite documentation
=====================
.. warning::
This project is **no longer maintained** as of February 2023. It is recommended that you use a proper ORM like `SQLAlchemy `_ or `Django's ORM `_ instead.
isqlite is an improved Python interface to SQLite. It has a more convenient API, support for schema diffing and migrations, and a command-line interface. It was written by `Ian Fisher `_ and the source code is available `on GitHub `_.
Features
--------
* An improved Python API.
* e.g., ``db.insert("people", {"name": "John Doe"})`` instead of ``cursor.execute("INSERT INTO people VALUES ('John Doe')")``.
* Rows are returned as ``OrderedDict`` objects instead of tuples.
* Helper methods to simplify common patterns, e.g. ``get_or_insert`` and ``insert_many``.
* Database migrations with automatic schema diffing.
* Automatically diff the database against a schema defined in Python and apply the results.
* Or, manually alter the database schema from the command-line using commands like ``isqlite drop-table`` and ``isqlite rename-column``.
* A command-line interface.
Usage
-----
isqlite includes a convenient Python API that greatly simplifies working with SQL::
from isqlite import Database
with Database(":memory:") as db:
# Insert a new row into the database.
pk = db.insert("employees", {"name": "John Doe", "age": 30})
# Retrieve the row as an OrderedDict.
person = db.get_by_pk("employees", pk)
print(person["name"], person["age"])
# Update the row.
db.update_by_pk("employees", pk, {"age": 35})
# Delete the row.
db.delete_by_pk("employees", pk)
# Filter rows with a query.
employees = db.select(
"employees",
where="name LIKE :name_pattern AND age > 40",
values={"name_pattern": "John%"},
)
# Use raw SQL if necessary.
pairs = db.sql(
"""
SELECT
teams.name, employees.name
FROM
employees
INNER JOIN
teams
ON
employees.team = teams.id
"""
)
Contents
--------
.. toctree::
:maxdepth: 2
installation
howto
schemas
cli
limitations
security
api
Indices and tables
------------------
* :ref:`genindex`
* :ref:`search`