Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions sqlspec/migrations/loaders.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ async def get_up_sql(self, path: Path) -> list[str]:
Raises:
MigrationLoadError: If migration file is invalid or missing up query.
"""
self.sql_loader.clear_cache()
self.sql_loader.load_sql(path)

version = self._extract_version(path.name)
Expand All @@ -115,7 +114,6 @@ async def get_down_sql(self, path: Path) -> list[str]:
Returns:
List containing single SQL statement for downgrade, or empty list.
"""
self.sql_loader.clear_cache()
self.sql_loader.load_sql(path)

version = self._extract_version(path.name)
Expand All @@ -141,7 +139,6 @@ def validate_migration_file(self, path: Path) -> None:
msg = f"Invalid migration filename: {path.name}"
raise MigrationLoadError(msg)

self.sql_loader.clear_cache()
self.sql_loader.load_sql(path)
up_query = f"migrate-{version}-up"
if not self.sql_loader.has_query(up_query):
Expand Down
2 changes: 0 additions & 2 deletions sqlspec/migrations/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,6 @@ def load_migration(self, file_path: Path, version: "str | None" = None) -> "dict
if file_path.suffix == ".sql":
version = metadata["version"]
up_query, down_query = f"migrate-{version}-up", f"migrate-{version}-down"
self.loader.clear_cache()
self.loader.load_sql(file_path)
has_upgrade, has_downgrade = self.loader.has_query(up_query), self.loader.has_query(down_query)
else:
Expand Down Expand Up @@ -394,7 +393,6 @@ async def load_migration(self, file_path: Path, version: "str | None" = None) ->
if file_path.suffix == ".sql":
version = metadata["version"]
up_query, down_query = f"migrate-{version}-up", f"migrate-{version}-down"
self.loader.clear_cache()
await async_(self.loader.load_sql)(file_path)
has_upgrade, has_downgrade = self.loader.has_query(up_query), self.loader.has_query(down_query)
else:
Expand Down
38 changes: 38 additions & 0 deletions tests/unit/test_migrations/test_migration_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -538,3 +538,41 @@ def test_many_migration_files_performance() -> None:
for i, (version, _) in enumerate(files):
expected_version = f"{i + 1:04d}"
assert version == expected_version


def test_sql_loader_caches_files() -> None:
"""Test that SQL migration files leverage CoreSQLFileLoader caching.

Verifies fix for bug #118 - duplicate SQL loading during migrations.
The SQLFileLoader should NOT call clear_cache() before operations,
allowing CoreSQLFileLoader's internal caching to work properly.
"""
import asyncio

from sqlspec.migrations.loaders import SQLFileLoader

with tempfile.TemporaryDirectory() as temp_dir:
migrations_path = Path(temp_dir)

migration_file = migrations_path / "0001_test_migration.sql"
migration_content = """
-- name: migrate-0001-up
CREATE TABLE test (id INTEGER PRIMARY KEY);

-- name: migrate-0001-down
DROP TABLE test;
"""
migration_file.write_text(migration_content)

sql_loader = SQLFileLoader()

async def test_operations() -> None:
await sql_loader.get_up_sql(migration_file)
path_str = str(migration_file)
assert path_str in sql_loader.sql_loader._files
assert sql_loader.sql_loader.has_query("migrate-0001-up")
assert sql_loader.sql_loader.has_query("migrate-0001-down")
await sql_loader.get_down_sql(migration_file)
assert path_str in sql_loader.sql_loader._files

asyncio.run(test_operations())