Skip to content

Bug: Core dependencies not installed by default #651

@nils-werner

Description

@nils-werner

Description

Hey,

I've installed advanced alchemy using

uv add advanced-alchemy

and when trying to create migrations using

uv run litestar database init
uv run litestar database make-migrations

during make-migrations I was seeing an exception

  File "project/migrations/versions/2025-12-26_projects_bd10962d4493.py", line 16, in <module>
    from advanced_alchemy.types.password_hash.argon2 import Argon2Hasher
  File "project/.venv/lib/python3.14/site-packages/advanced_alchemy/types/password_hash/argon2.py", line 10, in <module>
    from argon2 import PasswordHasher as Argon2PasswordHasher  # pyright: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named 'argon2'

And the same for passlib and pwdlib

In the end I had to install advanced alchemy using

uv add advanced-alchemy[argon2,cli,passlib,pwdlib]

to make migrations work. This bevhaviour does not seem documented anywhere and is a bit surprising to see.

URL to code causing the issue

No response

MCVE

# Your MCVE code here

Steps to reproduce

1. Run

        uv add advanced-alchemy
        uv run litestar database init
        uv run litestar database make-migrations

2. Observe exceptions raised
3. Run

        uv add advanced-alchemy[argon2,cli,passlib,pwdlib]
        uv run litestar database init
        uv run litestar database make-migrations

4. Exceptions no longer raised

Screenshots

None

Logs

`uuid-utils` not installed, falling back to `uuid4` for UUID v7 generation.
project/.venv/lib/python3.14/site-packages/litestar/plugins/pydantic/utils.py:28: UserWarning: Core Pydantic V1 functionality isn't compatible with Python 3.14 or greater.
  from pydantic import v1 as pydantic_v1
{"event":"Context impl SQLiteImpl.","timestamp":"2025-12-28T10:09:18.252630Z","level":"info","message":"Context impl SQLiteImpl."}
{"event":"Will assume non-transactional DDL.","timestamp":"2025-12-28T10:09:18.252728Z","level":"info","message":"Will assume non-transactional DDL."}
Traceback (most recent call last):
  File "project/.venv/bin/litestar", line 10, in <module>
    sys.exit(run_cli())
             ~~~~~~~^^
  File "project/.venv/lib/python3.14/site-packages/litestar/__main__.py", line 6, in run_cli
    litestar_group()
    ~~~~~~~~~~~~~~^^
  File "project/.venv/lib/python3.14/site-packages/rich_click/rich_command.py", line 402, in __call__
    return super().__call__(*args, **kwargs)
           ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/click/core.py", line 1485, in __call__
    return self.main(*args, **kwargs)
           ~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/rich_click/rich_command.py", line 216, in main
    rv = self.invoke(ctx)
  File "project/.venv/lib/python3.14/site-packages/click/core.py", line 1873, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/click/core.py", line 1873, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/click/core.py", line 1269, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/click/core.py", line 824, in invoke
    return callback(*args, **kwargs)
  File "project/.venv/lib/python3.14/site-packages/click/decorators.py", line 34, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "project/.venv/lib/python3.14/site-packages/litestar/cli/_utils.py", line 269, in wrapped
    return func(*args, **kwargs)
  File "project/.venv/lib/python3.14/site-packages/click/decorators.py", line 34, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "project/.venv/lib/python3.14/site-packages/litestar/cli/_utils.py", line 269, in wrapped
    return func(*args, **kwargs)
  File "project/.venv/lib/python3.14/site-packages/advanced_alchemy/cli.py", line 552, in create_revision
    alembic_commands.revision(
    ~~~~~~~~~~~~~~~~~~~~~~~~~^
        message=message,
        ^^^^^^^^^^^^^^^^
    ...<7 lines>...
        process_revision_directives=process_revision_directives,  # type: ignore[arg-type]
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "project/.venv/lib/python3.14/site-packages/advanced_alchemy/alembic/commands.py", line 294, in revision
    return migration_command.revision(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~^
        config=self.config,
        ^^^^^^^^^^^^^^^^^^^
    ...<9 lines>...
        process_revision_directives=process_revision_directives,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "project/.venv/lib/python3.14/site-packages/alembic/command.py", line 309, in revision
    script_directory.run_env()
    ~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "project/.venv/lib/python3.14/site-packages/alembic/script/base.py", line 545, in run_env
    util.load_python_file(self.dir, "env.py")
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
    module = load_module_py(module_id, path)
  File "project/.venv/lib/python3.14/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "<frozen importlib._bootstrap_external>", line 759, in exec_module
  File "<frozen importlib._bootstrap>", line 491, in _call_with_frames_removed
  File "project/migrations/env.py", line 107, in <module>
    asyncio.run(run_migrations_online())
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/nils/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py", line 204, in run
    return runner.run(main)
           ~~~~~~~~~~^^^^^^
  File "/home/nils/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py", line 127, in run
    return self._loop.run_until_complete(task)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/home/nils/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py", line 719, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File "project/migrations/env.py", line 99, in run_migrations_online
    await connection.run_sync(do_run_migrations)
  File "project/.venv/lib/python3.14/site-packages/sqlalchemy/ext/asyncio/engine.py", line 888, in run_sync
    return await greenlet_spawn(
           ^^^^^^^^^^^^^^^^^^^^^
        fn, self._proxied, *arg, _require_await=False, **kw
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "project/.venv/lib/python3.14/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
    result = context.switch(value)
  File "project/migrations/env.py", line 67, in do_run_migrations
    context.run_migrations()
    ~~~~~~~~~~~~~~~~~~~~~~^^
  File "<string>", line 8, in run_migrations
  File "project/.venv/lib/python3.14/site-packages/alembic/runtime/environment.py", line 946, in run_migrations
    self.get_context().run_migrations(**kw)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/runtime/migration.py", line 615, in run_migrations
    for step in self._migrations_fn(heads, self):
                ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/command.py", line 285, in retrieve_migrations
    revision_context.run_autogenerate(rev, context)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/autogenerate/api.py", line 570, in run_autogenerate
    self._run_environment(rev, migration_context, True)
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/autogenerate/api.py", line 588, in _run_environment
    if set(self.script_directory.get_revisions(rev)) != set(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/script/base.py", line 276, in get_revisions
    self.revision_map.get_revisions(id_),
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/script/revision.py", line 542, in get_revisions
    return sum([self.get_revisions(id_elem) for id_elem in id_], ())
                ~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/script/revision.py", line 544, in get_revisions
    resolved_id, branch_label = self._resolve_revision_number(id_)
                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/script/revision.py", line 768, in _resolve_revision_number
    self._revision_map
  File "project/.venv/lib/python3.14/site-packages/sqlalchemy/util/langhelpers.py", line 1226, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
                                           ~~~~~~~~~^^^^^
  File "project/.venv/lib/python3.14/site-packages/alembic/script/revision.py", line 209, in _revision_map
    for revision in self._generator():
                    ~~~~~~~~~~~~~~~^^
  File "project/.venv/lib/python3.14/site-packages/alembic/script/base.py", line 155, in _load_revisions
    script = Script._from_path(self, real_path)
  File "project/.venv/lib/python3.14/site-packages/alembic/script/base.py", line 1033, in _from_path
    module = util.load_python_file(dir_, filename)
  File "project/.venv/lib/python3.14/site-packages/alembic/util/pyfiles.py", line 116, in load_python_file
    module = load_module_py(module_id, path)
  File "project/.venv/lib/python3.14/site-packages/alembic/util/pyfiles.py", line 136, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "<frozen importlib._bootstrap_external>", line 759, in exec_module
  File "<frozen importlib._bootstrap>", line 491, in _call_with_frames_removed
  File "project/migrations/versions/2025-12-26_projects_bd10962d4493.py", line 16, in <module>
    from advanced_alchemy.types.password_hash.argon2 import Argon2Hasher
  File "project/.venv/lib/python3.14/site-packages/advanced_alchemy/types/password_hash/argon2.py", line 10, in <module>
    from argon2 import PasswordHasher as Argon2PasswordHasher  # pyright: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named 'argon2'
Exception ignored while joining a thread in _thread._shutdown():
Traceback (most recent call last):
  File "/home/nils/.local/share/uv/python/cpython-3.14.2-linux-x86_64-gnu/lib/python3.14/threading.py", line 1583, in _shutdown
    _thread_shutdown()
KeyboardInterrupt:

Package Version

1.8.1

Platform

  • Linux
  • Mac
  • Windows
  • Other (Please specify in the description above)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions