.. _custom_alembic: Alembic on custom tables ======================== If you want to manage custom tables (GMF tables; not in the ``main`` nor the ``static`` schema) with alembic you must setup a custom alembic process. Here's an example. Others solutions are possible, but do not try to reuse the existing ``alembic.ini`` (because you will not be able to specify a schema through the configuration levels). The following example uses ``docker cp``. You can achieve the same with a volume, but you will have to set the owner (root) of copied files. Init alembic ------------ In your project, add a ``geoportal/alembic_`` folder. Build and run your project. In the running container initialize alembic in a folder that have **not** already an ``alembic.ini`` file, like the /tmp folder. Create also directly the first revision file: .. prompt:: bash docker-compose exec geoportal mkdir /tmp/new_alembic docker-compose exec geoportal bash -c "cd /tmp/new_alembic; alembic init alembic" # Ignore the warning message about setting the alembic.ini file for now. docker-compose exec geoportal bash -c "cd /tmp/new_alembic; alembic revision -m 'Inital revision'" Run ``docker-compose ps geoportal`` to know the name of the running geoportal container. Then copy the generated alembic folder in the ``geoportal`` folder of your project: .. prompt:: bash PROJECT= docker cp :/tmp/new_alembic geoportal/alembic_${PROJECT} You can now customize the ``alembic.ini`` and the ``env.py``. Configure ``alembic.ini`` ------------------------- The main change to apply is to use environment variables to run alembic on the right database. To do so, use a ``tmpl`` file: .. prompt:: bash mv geoportal/alembic_${PROJECT}/alembic.ini{,.tmpl} rm geoportal/alembic_${PROJECT}/alembic.ini echo "/geoportal/alembic_${PROJECT}/alembic.ini" >> .gitignore And inside the ``alembic.ini.tmpl`` set the ``sqlalchemy.url`` to ``postgresql://${PGUSER}:${PGPASSWORD}@${PGHOST}:${PGPORT}/${PGDATABASE}``. In this file, you may also directly set a new variable ``version_table_schema`` to set the name of the schema inside which alembic must create its revision table. See: `The Environment Context `_. You must now set permissions on this tmpl file to authorise evaluation of this ``tmpl`` file. Add the following lines in the ``geoportal/Dockerfile`` just before the command ``ENTRYPOINT [ "/usr/bin/eval-templates" ]``, in the ``FROM camptocamp/geomapfish`` section. .. code:: # Custom - To be able to run tmpl on alembic.ini.tmpl file RUN rm -f /app/alembic_/alembic.ini && \ chmod g+w /app/alembic_ && \ chown www-data /app/alembic_/alembic.ini.tmpl Configure ``env.py`` -------------------- Edit the file ``geoportal/alembic_${PROJECT}/alembic/env.py``. In there, update the ``run_migrations_offline`` function by adding ``version_table_schema = config.get_main_option("version_table_schema")`` to get the schema name from the ``alembic.ini`` file. Add this value as parameter of the ``context.configure()`` function. Do the same in the ``run_migrations_online`` function. At this point, you should be able to run your (currently empty) first revision file. Run an alembic upgrade ---------------------- Once your revision file completed, build and run docker-compose up on your project. Your alembic files should be in the running container. You can now run manually an upgrade with: .. prompt:: bash docker-compose exec geoportal bash -c "cd /app/alembic_${PROJECT}; alembic upgrade head" Create a new revision file -------------------------- With a running instance, execute: .. prompt:: bash docker-compose exec geoportal bash -c "cd /app/alembic_${PROJECT}; alembic revision -m ''" docker cp :/app/alembic_${PROJECT}/alembic/versions/ geoportal/alembic_${PROJECT}/alembic/versions/.