comparison sat/memory/migration/env.py @ 3582:71516731d0aa

core (memory/sqla): database migration using Alembic: Alembic database migration tool, which is the recommended one for SQLAlchemy has been integrated. When a database is created, it will be used to stamp to current (head) revision, otherwise, DB will be checked to see if it needs to be updated, and upgrade will be triggered if necessary.
author Goffi <goffi@goffi.org>
date Fri, 25 Jun 2021 17:55:23 +0200
parents
children 54c249ec35ce
comparison
equal deleted inserted replaced
3581:84ea57a8d6b3 3582:71516731d0aa
1 import asyncio
2 from logging.config import fileConfig
3 from sqlalchemy import pool
4 from sqlalchemy.ext.asyncio import create_async_engine
5 from alembic import context
6 from sat.memory import sqla_config
7 from sat.memory.sqla_mapping import Base
8
9 # this is the Alembic Config object, which provides
10 # access to the values within the .ini file in use.
11 config = context.config
12
13 # Interpret the config file for Python logging.
14 # This line sets up loggers basically.
15 fileConfig(config.config_file_name)
16
17 # add your model's MetaData object here
18 # for 'autogenerate' support
19 # from myapp import mymodel
20 # target_metadata = mymodel.Base.metadata
21 target_metadata = Base.metadata
22
23 # other values from the config, defined by the needs of env.py,
24 # can be acquired:
25 # my_important_option = config.get_main_option("my_important_option")
26 # ... etc.
27
28
29 def run_migrations_offline():
30 """Run migrations in 'offline' mode.
31
32 This configures the context with just a URL
33 and not an Engine, though an Engine is acceptable
34 here as well. By skipping the Engine creation
35 we don't even need a DBAPI to be available.
36
37 Calls to context.execute() here emit the given string to the
38 script output.
39
40 """
41 db_config = sqla_config.getDbConfig()
42 context.configure(
43 url=db_config["url"],
44 target_metadata=target_metadata,
45 literal_binds=True,
46 dialect_opts={"paramstyle": "named"},
47 )
48
49 with context.begin_transaction():
50 context.run_migrations()
51
52
53 def do_run_migrations(connection):
54 context.configure(
55 connection=connection,
56 target_metadata=target_metadata,
57 render_as_batch=True
58 )
59
60 with context.begin_transaction():
61 context.run_migrations()
62
63
64 async def run_migrations_online():
65 """Run migrations in 'online' mode.
66
67 In this scenario we need to create an Engine
68 and associate a connection with the context.
69
70 """
71 db_config = sqla_config.getDbConfig()
72 engine = create_async_engine(
73 db_config["url"],
74 poolclass=pool.NullPool,
75 future=True,
76 )
77
78 async with engine.connect() as connection:
79 await connection.run_sync(do_run_migrations)
80
81
82 if context.is_offline_mode():
83 run_migrations_offline()
84 else:
85 asyncio.run(run_migrations_online())