@ -0,0 +1 @@ | |||||
Generic single-database configuration. |
@ -0,0 +1,45 @@ | |||||
# A generic, single database configuration. | |||||
[alembic] | |||||
# template used to generate migration files | |||||
# file_template = %%(rev)s_%%(slug)s | |||||
# set to 'true' to run the environment during | |||||
# the 'revision' command, regardless of autogenerate | |||||
# revision_environment = false | |||||
# Logging configuration | |||||
[loggers] | |||||
keys = root,sqlalchemy,alembic | |||||
[handlers] | |||||
keys = console | |||||
[formatters] | |||||
keys = generic | |||||
[logger_root] | |||||
level = WARN | |||||
handlers = console | |||||
qualname = | |||||
[logger_sqlalchemy] | |||||
level = WARN | |||||
handlers = | |||||
qualname = sqlalchemy.engine | |||||
[logger_alembic] | |||||
level = INFO | |||||
handlers = | |||||
qualname = alembic | |||||
[handler_console] | |||||
class = StreamHandler | |||||
args = (sys.stderr,) | |||||
level = NOTSET | |||||
formatter = generic | |||||
[formatter_generic] | |||||
format = %(levelname)-5.5s [%(name)s] %(message)s | |||||
datefmt = %H:%M:%S |
@ -0,0 +1,96 @@ | |||||
from __future__ import with_statement | |||||
import logging | |||||
from logging.config import fileConfig | |||||
from sqlalchemy import engine_from_config | |||||
from sqlalchemy import pool | |||||
from alembic import context | |||||
# 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. | |||||
fileConfig(config.config_file_name) | |||||
logger = logging.getLogger('alembic.env') | |||||
# add your model's MetaData object here | |||||
# for 'autogenerate' support | |||||
# from myapp import mymodel | |||||
# target_metadata = mymodel.Base.metadata | |||||
from flask import current_app | |||||
config.set_main_option( | |||||
'sqlalchemy.url', | |||||
str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%')) | |||||
target_metadata = current_app.extensions['migrate'].db.metadata | |||||
# other values from the config, defined by the needs of env.py, | |||||
# 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") | |||||
context.configure( | |||||
url=url, target_metadata=target_metadata, literal_binds=True | |||||
) | |||||
with context.begin_transaction(): | |||||
context.run_migrations() | |||||
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. | |||||
""" | |||||
# this callback is used to prevent an auto-migration from being generated | |||||
# when there are no changes to the schema | |||||
# reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html | |||||
def process_revision_directives(context, revision, directives): | |||||
if getattr(config.cmd_opts, 'autogenerate', False): | |||||
script = directives[0] | |||||
if script.upgrade_ops.is_empty(): | |||||
directives[:] = [] | |||||
logger.info('No changes in schema detected.') | |||||
connectable = engine_from_config( | |||||
config.get_section(config.config_ini_section), | |||||
prefix='sqlalchemy.', | |||||
poolclass=pool.NullPool, | |||||
) | |||||
with connectable.connect() as connection: | |||||
context.configure( | |||||
connection=connection, | |||||
target_metadata=target_metadata, | |||||
process_revision_directives=process_revision_directives, | |||||
**current_app.extensions['migrate'].configure_args | |||||
) | |||||
with context.begin_transaction(): | |||||
context.run_migrations() | |||||
if context.is_offline_mode(): | |||||
run_migrations_offline() | |||||
else: | |||||
run_migrations_online() |
@ -0,0 +1,24 @@ | |||||
"""${message} | |||||
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"} |
@ -0,0 +1,28 @@ | |||||
"""empty message | |||||
Revision ID: 483862f48958 | |||||
Revises: | |||||
Create Date: 2020-08-19 09:56:23.732485 | |||||
""" | |||||
from alembic import op | |||||
import sqlalchemy as sa | |||||
# revision identifiers, used by Alembic. | |||||
revision = '483862f48958' | |||||
down_revision = None | |||||
branch_labels = None | |||||
depends_on = None | |||||
def upgrade(): | |||||
# ### commands auto generated by Alembic - please adjust! ### | |||||
op.add_column('user', sa.Column('root', sa.BigInteger(), nullable=True)) | |||||
# ### end Alembic commands ### | |||||
def downgrade(): | |||||
# ### commands auto generated by Alembic - please adjust! ### | |||||
op.drop_column('user', 'root') | |||||
# ### end Alembic commands ### |