Database operations
===================
Supported databases
~~~~~~~~~~~~~~~~~~~
Rucio uses `SQLAlchemy `_ as the object-relational mapper between Python and SQL. Rucio is extensively tested against SQLite, MySQL/MariaDB, PostgreSQL, and Oracle and should work with them out of the box. The appropriate connection string has to be set in the ``etc/rucio.cfg``, for example:
Oracle: ``oracle://rucio:rucio@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=10121))(ENABLE=BROKEN)(CONNECT_DATA=(SERVICE_NAME=localhost)))``
MySQL/MariaDB: ``mysql+pymysql://rucio:rucio@localhost/rucio``
PostgreSQL: ``postgresql://rucio:rucio@localhost:6601/rucio``
SQLite: ``sqlite:////tmp/rucio.db``
Please ensure correct UNIX permissions on the SQLite file, such that the web server process can read and write to it.
Upgrading and downgrading the database schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Rucio uses `Alembic `_ as a database migration tool, which works hand-in-hand with `SQLAlchemy `_. Ensure that int ``etc/alembic.ini`` the database connection string is is set to the same database connection string as the ``etc/rucio.cfg`` and issue the following command to verify the changes to the upgrade of the schema:
``alembic upgrade head --sql``
Once satisfied, you can either apply the SQL directly on your database, or have them applied automatically:
``alembic upgrade head``
In case of problems with the release, you can always downgrade back to the previous release:
``alembic downgrade head``
Notabene, schema upgrades are reserved for feature releases and will not happen with patch releases.
Creating a new version as a developer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you want to create an upgrade path for the schema, you need to generate a schema upgrade+downgrade file:
``alembic revision -m 'schema change message'``
This will output the name of the file that has been generated with two functions ``def upgrade()`` and ``def downgrade()`` that need to be implemented. These should reflect the changes to the ``lib/rucio/db/sqla/models.py`` SQLAlchemy mapping.