PostgreSQL Support in conda-index

As of conda-index 0.7.0, conda-index can use a PostgreSQL database. conda-index uses a database to store package metadata, creating repodata from a query. By default, it will use a sqlite3 database stored alongside the package files, but it can optionally use PostgreSQL.

The database backend is controlled by the --db <backend> and --db-url command line arguments, or the CONDA_INDEX_DBURL environment variable replaces --db-url. For example, python -m conda_index --db postgresql chooses PostgreSQL with the default postgresql:///conda_index database URL.

To use a PostgreSQL database with conda-index, install conda-index’s PostgreSQL-specific dependencies into its environment:

conda install sqlalchemy psycopg2

Then, install a local PostgreSQL with conda:

# Create a local PostgreSQL installation and conda_index database
conda install postgresql
initdb -D conda-index-db
pg_ctl -D conda-index-db -l logfile start
createdb conda_index

Finally, run the following command:

python -m conda_index --db postgresql --db-url postgresql:///conda_index [DIR]

conda_index stores package metadata in the PostgreSQL database given by a SQLAlchemy database URL.

The schema is similar to the one used for sqlite3, except that while sqlite3 uses a database file per subdirectory, in PostgreSQL all subdirectories are stored in the same database. conda_index creates a random prefix in [DIR]/.cache/cache.json to differentiate this channel from any others that may be stored in the same PostgreSQL database. Each package name is stored with the format <prefix>/<subdir>/<package>.conda in a single database.

Advanced users can use the CLI or the API to run conda_index on a partial local package repository. It is possible to add a few local packages to a much larger index instead of keeping every package on the machine running conda-index. For example, by inserting packages into the stat table and then running python -m conda_index --db postgresql --no-update-cache [DIR], conda-index can add or update packages in [DIR] to repodata without necessarily storing either the entire set of packages or the conda-index database on that machine.