Passed
Push — master ( cfbfb4...cd6825 )
by William
02:24
created

env   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 114
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 52
dl 0
loc 114
rs 10
c 0
b 0
f 0
wmc 14

5 Functions

Rating   Name   Duplication   Size   Complexity  
B run_migrations_online() 0 33 6
A get_metadata() 0 4 2
A get_engine() 0 7 2
A get_engine_url() 0 6 2
A run_migrations_offline() 0 19 2
1
import logging
2
from logging.config import fileConfig
3
4
from flask import current_app
5
6
from alembic import context
7
8
# this is the Alembic Config object, which provides
9
# access to the values within the .ini file in use.
10
config = context.config
11
12
# Interpret the config file for Python logging.
13
# This line sets up loggers basically.
14
fileConfig(config.config_file_name)
15
logger = logging.getLogger('alembic.env')
16
17
18
def get_engine():
19
    try:
20
        # this works with Flask-SQLAlchemy<3 and Alchemical
21
        return current_app.extensions['migrate'].db.get_engine()
22
    except (TypeError, AttributeError):
23
        # this works with Flask-SQLAlchemy>=3
24
        return current_app.extensions['migrate'].db.engine
25
26
27
def get_engine_url():
28
    try:
29
        return get_engine().url.render_as_string(hide_password=False).replace(
30
            '%', '%%')
31
    except AttributeError:
32
        return str(get_engine().url).replace('%', '%%')
33
34
35
# add your model's MetaData object here
36
# for 'autogenerate' support
37
# from myapp import mymodel
38
# target_metadata = mymodel.Base.metadata
39
config.set_main_option('sqlalchemy.url', get_engine_url())
40
target_db = current_app.extensions['migrate'].db
41
42
# other values from the config, defined by the needs of env.py,
43
# can be acquired:
44
# my_important_option = config.get_main_option("my_important_option")
45
# ... etc.
46
47
48
def get_metadata():
49
    if hasattr(target_db, 'metadatas'):
50
        return target_db.metadatas[None]
51
    return target_db.metadata
52
53
54
def run_migrations_offline():
55
    """Run migrations in 'offline' mode.
56
57
    This configures the context with just a URL
58
    and not an Engine, though an Engine is acceptable
59
    here as well.  By skipping the Engine creation
60
    we don't even need a DBAPI to be available.
61
62
    Calls to context.execute() here emit the given string to the
63
    script output.
64
65
    """
66
    url = config.get_main_option("sqlalchemy.url")
67
    context.configure(
68
        url=url, target_metadata=get_metadata(), literal_binds=True
69
    )
70
71
    with context.begin_transaction():
72
        context.run_migrations()
73
74
75
def run_migrations_online():
76
    """Run migrations in 'online' mode.
77
78
    In this scenario we need to create an Engine
79
    and associate a connection with the context.
80
81
    """
82
83
    # this callback is used to prevent an auto-migration from being generated
84
    # when there are no changes to the schema
85
    # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html
86
    def process_revision_directives(context, revision, directives):
87
        if getattr(config.cmd_opts, 'autogenerate', False):
88
            script = directives[0]
89
            if script.upgrade_ops.is_empty():
90
                directives[:] = []
91
                logger.info('No changes in schema detected.')
92
93
    conf_args = current_app.extensions['migrate'].configure_args
94
    if conf_args.get("process_revision_directives") is None:
95
        conf_args["process_revision_directives"] = process_revision_directives
96
97
    connectable = get_engine()
98
99
    with connectable.connect() as connection:
100
        context.configure(
101
            connection=connection,
102
            target_metadata=get_metadata(),
103
            **conf_args
104
        )
105
106
        with context.begin_transaction():
107
            context.run_migrations()
108
109
110
if context.is_offline_mode():
111
    run_migrations_offline()
112
else:
113
    run_migrations_online()
114