Skip to content

Commit c051a00

Browse files
Better handling of MetaData instances in templates
1 parent cac1cb8 commit c051a00

File tree

4 files changed

+32
-13
lines changed

4 files changed

+32
-13
lines changed

src/flask_migrate/templates/aioflask-multidb/env.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
bind, "sqlalchemy.url",
4242
str(current_app.extensions['migrate'].db.get_engine(
4343
bind=bind).url).replace('%', '%%'))
44-
target_metadata = current_app.extensions['migrate'].db.metadata
44+
target_db = current_app.extensions['migrate'].db
4545

4646

4747
# other values from the config, defined by the needs of env.py,
@@ -54,8 +54,12 @@ def get_metadata(bind):
5454
"""Return the metadata for a bind."""
5555
if bind == '':
5656
bind = None
57+
if hasattr(target_db, 'metadatas'):
58+
return target_db.metadatas[bind]
59+
60+
# legacy, less flexible implementation
5761
m = MetaData()
58-
for t in target_metadata.tables.values():
62+
for t in target_db.metadata.tables.values():
5963
if t.info.get('bind_key') == bind:
6064
t.tometadata(m)
6165
return m
@@ -182,4 +186,4 @@ async def run_migrations_online():
182186
if context.is_offline_mode():
183187
run_migrations_offline()
184188
else:
185-
asyncio.run(run_migrations_online())
189+
asyncio.get_event_loop().run_until_complete(run_migrations_online())

src/flask_migrate/templates/aioflask/env.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,20 @@
2525
'sqlalchemy.url',
2626
str(current_app.extensions['migrate'].db.get_engine().url).replace(
2727
'%', '%%'))
28-
target_metadata = current_app.extensions['migrate'].db.metadata
28+
target_db = current_app.extensions['migrate'].db
2929

3030
# other values from the config, defined by the needs of env.py,
3131
# can be acquired:
3232
# my_important_option = config.get_main_option("my_important_option")
3333
# ... etc.
3434

3535

36+
def get_metadata():
37+
if hasattr(target_db, 'metadatas'):
38+
return target_db.metadatas[None]
39+
return target_db.metadata
40+
41+
3642
def run_migrations_offline():
3743
"""Run migrations in 'offline' mode.
3844
@@ -47,7 +53,7 @@ def run_migrations_offline():
4753
"""
4854
url = config.get_main_option("sqlalchemy.url")
4955
context.configure(
50-
url=url, target_metadata=target_metadata, literal_binds=True
56+
url=url, target_metadata=get_metadata(), literal_binds=True
5157
)
5258

5359
with context.begin_transaction():
@@ -67,7 +73,7 @@ def process_revision_directives(context, revision, directives):
6773

6874
context.configure(
6975
connection=connection,
70-
target_metadata=target_metadata,
76+
target_metadata=get_metadata(),
7177
process_revision_directives=process_revision_directives,
7278
**current_app.extensions['migrate'].configure_args
7379
)
@@ -93,4 +99,4 @@ async def run_migrations_online():
9399
if context.is_offline_mode():
94100
run_migrations_offline()
95101
else:
96-
asyncio.run(run_migrations_online())
102+
asyncio.get_event_loop().run_until_complete(run_migrations_online())

src/flask_migrate/templates/flask-multidb/env.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@
4040
bind, "sqlalchemy.url",
4141
str(current_app.extensions['migrate'].db.get_engine(
4242
bind=bind).url).replace('%', '%%'))
43-
target_metadata = current_app.extensions['migrate'].db.metadata
44-
43+
target_db = current_app.extensions['migrate'].db
4544

4645
# other values from the config, defined by the needs of env.py,
4746
# can be acquired:
@@ -53,8 +52,12 @@ def get_metadata(bind):
5352
"""Return the metadata for a bind."""
5453
if bind == '':
5554
bind = None
55+
if hasattr(target_db, 'metadatas'):
56+
return target_db.metadatas[bind]
57+
58+
# legacy, less flexible implementation
5659
m = MetaData()
57-
for t in target_metadata.tables.values():
60+
for t in target_db.metadata.tables.values():
5861
if t.info.get('bind_key') == bind:
5962
t.tometadata(m)
6063
return m

src/flask_migrate/templates/flask/env.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,20 @@
2424
'sqlalchemy.url',
2525
str(current_app.extensions['migrate'].db.get_engine().url).replace(
2626
'%', '%%'))
27-
target_metadata = current_app.extensions['migrate'].db.metadata
27+
target_db = current_app.extensions['migrate'].db
2828

2929
# other values from the config, defined by the needs of env.py,
3030
# can be acquired:
3131
# my_important_option = config.get_main_option("my_important_option")
3232
# ... etc.
3333

3434

35+
def get_metadata():
36+
if hasattr(target_db, 'metadatas'):
37+
return target_db.metadatas[None]
38+
return target_db.metadata
39+
40+
3541
def run_migrations_offline():
3642
"""Run migrations in 'offline' mode.
3743
@@ -46,7 +52,7 @@ def run_migrations_offline():
4652
"""
4753
url = config.get_main_option("sqlalchemy.url")
4854
context.configure(
49-
url=url, target_metadata=target_metadata, literal_binds=True
55+
url=url, target_metadata=get_metadata(), literal_binds=True
5056
)
5157

5258
with context.begin_transaction():
@@ -76,7 +82,7 @@ def process_revision_directives(context, revision, directives):
7682
with connectable.connect() as connection:
7783
context.configure(
7884
connection=connection,
79-
target_metadata=target_metadata,
85+
target_metadata=get_metadata(),
8086
process_revision_directives=process_revision_directives,
8187
**current_app.extensions['migrate'].configure_args
8288
)

0 commit comments

Comments
 (0)