Skip to content

Commit d5d6951

Browse files
authored
Merge pull request olirice#105 from jdimmerman/feature/sqlalchemy-2-support
sqlalchemy 1.4 & 2.0 support (1.3 dropped)
2 parents aef523d + 3daa6e7 commit d5d6951

22 files changed

+224
-136
lines changed

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,23 @@ def downgrade():
116116
Visit the [quickstart guide](https://olirice.github.io/alembic_utils/quickstart/) for usage instructions.
117117

118118
<p align="center">&mdash;&mdash; &mdash;&mdash;</p>
119+
120+
### Contributing
121+
122+
To run the tests
123+
```
124+
# install pip dependencies
125+
pip install wheel && pip install -e ".[dev]"
126+
127+
# run the tests
128+
pytest src/test
129+
```
130+
131+
To invoke the linter automated formatting and generally make use of precommit checks:
132+
```
133+
pip install pre-commit
134+
pre-commit install
135+
136+
# manually run
137+
pre-commit run --all
138+
```

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def get_version(package):
3737
"alembic>=1.5.7",
3838
"flupy",
3939
"parse>=1.8.4",
40-
"sqlalchemy>=1.3.0,<2",
40+
"sqlalchemy>=1.4",
4141
"typing_extensions",
4242
],
4343
extras_require={

src/alembic_utils/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.8.0"
1+
__version__ = "0.8.1"

src/alembic_utils/simulate.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ def simulate_entity(
3232

3333
deps: List["ReplaceableEntity"] = dependencies or []
3434

35+
outer_transaction = sess.begin_nested()
3536
try:
36-
sess.begin_nested()
37-
3837
dependency_managers = [simulate_entity(sess, x) for x in deps]
3938

4039
with ExitStack() as stack:
@@ -43,8 +42,8 @@ def simulate_entity(
4342
stack.enter_context(mgr)
4443

4544
did_drop = False
45+
inner_transaction = sess.begin_nested()
4646
try:
47-
sess.begin_nested()
4847
sess.execute(entity.to_sql_statement_drop(cascade=True))
4948
did_drop = True
5049
sess.execute(entity.to_sql_statement_create())
@@ -58,11 +57,11 @@ def simulate_entity(
5857

5958
# Try again without the drop in case the drop raised
6059
# a does not exist error
61-
sess.rollback()
62-
sess.begin_nested()
60+
inner_transaction.rollback()
61+
inner_transaction = sess.begin_nested()
6362
sess.execute(entity.to_sql_statement_create())
6463
yield sess
6564
finally:
66-
sess.rollback()
65+
inner_transaction.rollback()
6766
finally:
68-
sess.rollback()
67+
outer_transaction.rollback()

src/alembic_utils/testbase.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ def build_alembic_config(engine: Engine) -> Config:
2727
path_to_alembic_ini = REPO_ROOT / "alembic.ini"
2828

2929
alembic_cfg = Config(path_to_alembic_ini)
30+
3031
# Make double sure alembic references the test database
31-
alembic_cfg.set_main_option("sqlalchemy.url", str(engine.url))
32+
alembic_cfg.set_main_option("sqlalchemy.url", engine.url.render_as_string(hide_password=False))
33+
3234
alembic_cfg.set_main_option("script_location", str((Path("src") / "test" / "alembic_config")))
3335
return alembic_cfg
3436

src/test/alembic_config/env.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ def run_migrations_online():
5757
config.get_section(config.config_ini_section),
5858
prefix="sqlalchemy.",
5959
poolclass=pool.NullPool,
60-
future=True,
6160
)
6261

6362
with connectable.connect() as connection:

src/test/conftest.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import pytest
1111
from parse import parse
12-
from sqlalchemy import create_engine
12+
from sqlalchemy import create_engine, text
1313
from sqlalchemy.engine import Engine
1414
from sqlalchemy.orm import Session, sessionmaker
1515

@@ -105,14 +105,15 @@ def raw_engine(maybe_start_pg: None) -> Generator[Engine, None, None]:
105105

106106

107107
@pytest.fixture(scope="function")
108-
def engine(raw_engine) -> Generator[Engine, None, None]:
108+
def engine(raw_engine: Engine) -> Generator[Engine, None, None]:
109109
"""Engine that has been reset between tests"""
110110

111111
def run_cleaners():
112112
registry.clear()
113-
raw_engine.execute("drop schema public cascade; create schema public;")
114-
raw_engine.execute('drop schema if exists "DEV" cascade; create schema "DEV";')
115-
raw_engine.execute('drop role if exists "anon_user"')
113+
with raw_engine.begin() as connection:
114+
connection.execute(text("drop schema public cascade; create schema public;"))
115+
connection.execute(text('drop schema if exists "DEV" cascade; create schema "DEV";'))
116+
connection.execute(text('drop role if exists "anon_user"'))
116117
# Remove any migrations that were left behind
117118
TEST_VERSIONS_ROOT.mkdir(exist_ok=True, parents=True)
118119
shutil.rmtree(TEST_VERSIONS_ROOT)

src/test/test_create_function.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from sqlalchemy import text
2+
13
from alembic_utils.pg_function import PGFunction
24

35
to_upper = PGFunction(
@@ -18,8 +20,9 @@ def test_create_and_drop(engine) -> None:
1820
down_sql = to_upper.to_sql_statement_drop()
1921

2022
# Testing that the following two lines don't raise
21-
engine.execute(up_sql)
22-
result = engine.execute("select public.to_upper('hello');").fetchone()
23-
assert result[0] == "HELLO"
24-
engine.execute(down_sql)
25-
assert True
23+
with engine.begin() as connection:
24+
connection.execute(up_sql)
25+
result = connection.execute(text("select public.to_upper('hello');")).fetchone()
26+
assert result[0] == "HELLO"
27+
connection.execute(down_sql)
28+
assert True

src/test/test_include_filters.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,9 @@
7575

7676

7777
def test_create_revision_with_filters(engine) -> None:
78-
for entity in reflected_entities:
79-
engine.execute(entity.to_sql_statement_create())
78+
with engine.begin() as connection:
79+
for entity in reflected_entities:
80+
connection.execute(entity.to_sql_statement_create())
8081
register_entities(registered_entities)
8182

8283
run_alembic_command(

src/test/test_op_drop_cascade.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020

2121
def test_drop_fails_without_cascade(engine) -> None:
2222

23-
engine.execute(A.to_sql_statement_create())
24-
engine.execute(B_A.to_sql_statement_create())
23+
with engine.begin() as connection:
24+
connection.execute(A.to_sql_statement_create())
25+
connection.execute(B_A.to_sql_statement_create())
2526

2627
register_entities([B_A], schemas=["DEV"], entity_types=[PGView])
2728

@@ -48,8 +49,9 @@ def test_drop_fails_without_cascade(engine) -> None:
4849

4950
def test_drop_fails_with_cascade(engine, sess) -> None:
5051

51-
engine.execute(A.to_sql_statement_create())
52-
engine.execute(B_A.to_sql_statement_create())
52+
with engine.begin() as connection:
53+
connection.execute(A.to_sql_statement_create())
54+
connection.execute(B_A.to_sql_statement_create())
5355

5456
register_entities([B_A], schemas=["DEV"], entity_types=[PGView])
5557

0 commit comments

Comments
 (0)