Si vous constatez la perte de tickets, de commentaires ou de projets, veuillez consulter la page

Commit 5da06280 authored by Phyks (Lucas Verney)'s avatar Phyks (Lucas Verney)

Handle database migrations

parent dc9392e6
Pipeline #80613 failed with stage
in 7 minutes and 24 seconds
......@@ -77,4 +77,20 @@ If you want to add new data files, especially for public transportation stops
3. Write a preprocessing function in `flatisfy/data_files/`. You
can have a look at the existing functions for a model.
## Adding new migrations
If you want to change the database schema, you should create a matching
migration. Here is the way to do it correctly:
1. First, edit the `flatisfy/models` files to create / remove the required
fields. If you create a new database from scratch, these are the files
which will be used.
2. Then, run `alembic revision -m "Some description"` in the root of the git
repo to create a new migration.
3. Finally, edit the newly created migration file under the `migrations/`
folder to add the required code to alter the database (both upgrade and
# A generic, single database configuration.
# path to migration scripts
script_location = migrations
# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s
# timezone to use when rendering the date
# within the migration file as well as the filename.
# string value is passed to
# leave blank for localtime
# timezone =
# max length of characters to apply to the
# "slug" field
#truncate_slug_length = 40
# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false
# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false
# version location specification; this defaults
# to migrations/versions. When using multiple version
# directories, initial revisions must be specified with --version-path
# version_locations = %(here)s/bar %(here)s/bat migrations/versions
# the output encoding used when revision files
# are written from
# output_encoding = utf-8
sqlalchemy.url = sqlite:///data/flatisfy.db
# Logging configuration
keys = root,sqlalchemy,alembic
keys = console
keys = generic
level = WARN
handlers = console
qualname =
level = WARN
handlers =
qualname = sqlalchemy.engine
level = INFO
handlers =
qualname = alembic
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
......@@ -208,3 +208,13 @@ If you want to build the web assets, you can use `npm run build:dev`
(respectively `npm run watch:dev` to build continuously and monitor changes in
source files). You can use `npm run build:prod` (`npm run watch:prod`) to do
the same in production mode (with minification etc).
## Upgrading
To update the app, you can simply `git pull` the latest version. The database
schema might change from time to time. Here is how to update it automatically:
* First, edit the `alembic.ini` file and ensure the `sqlalchemy.url` entry
points to the database URI you are actually using for Flatisfy.
* Then, run `alembic upgrade head` to run the required migrations.
Generic single-database configuration.
\ No newline at end of file
from __future__ import with_statement
from alembic import context
from sqlalchemy import engine_from_config, pool
from logging.config import fileConfig
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
# Interpret the config file for Python logging.
# This line sets up loggers basically.
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = None
# other values from the config, defined by the needs of,
# can be acquired:
# my_important_option = config.get_main_option("my_important_option")
# ... etc.
def run_migrations_offline():
"""Run migrations in 'offline' mode.
This configures the context with just a URL
and not an Engine, though an Engine is acceptable
here as well. By skipping the Engine creation
we don't even need a DBAPI to be available.
Calls to context.execute() here emit the given string to the
script output.
url = config.get_main_option("sqlalchemy.url")
url=url, target_metadata=target_metadata, literal_binds=True)
with context.begin_transaction():
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
connectable = engine_from_config(
with connectable.connect() as connection:
with context.begin_transaction():
if context.is_offline_mode():
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}
from alembic import op
import sqlalchemy as sa
${imports if imports else ""}
# revision identifiers, used by Alembic.
revision = ${repr(up_revision)}
down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}
def upgrade():
${upgrades if upgrades else "pass"}
def downgrade():
${downgrades if downgrades else "pass"}
"""Add is_expired
Revision ID: 8155b83242eb
Create Date: 2018-10-16 22:51:25.442678
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '8155b83242eb'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
sa.Column('is_expired', sa.Boolean(), default=False)
def downgrade():
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment