From 0a2f0cb146912ab021e6d51bb9e7ef79cac207cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AE=81=E5=AE=B6=E5=AF=85?= <15277360553@163.com>
Date: Thu, 10 Sep 2026 23:15:37 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E5=9F=BA=E9=87=91?=
=?UTF-8?q?=E4=BA=A7=E5=93=81=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3,?=
=?UTF-8?q?=E5=8E=86=E5=8F=B2=E4=B8=9A=E7=BB=A9=E6=8E=A5=E5=8F=A3,?=
=?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=B3=A8=E5=86=8C=E6=8F=90=E4=BA=A4=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3,=E9=97=AE=E5=8D=B7=E6=8F=90=E4=BA=A4=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/Mutual_Fund.iml | 2 +-
.idea/misc.xml | 2 +-
api/router.py | 4 +-
api/routers/auth.py | 14 +-
logs/error.log | 851 +++++++++++++++++++++++++++++++++++++++
logs/info.log | 851 +++++++++++++++++++++++++++++++++++++++
repositories/sys_user.py | 5 +-
requirements.txt | 22 +-
schemas/auth.py | 9 +-
service/auth.py | 28 +-
sql/schema.sql | 1 -
11 files changed, 1767 insertions(+), 22 deletions(-)
diff --git a/.idea/Mutual_Fund.iml b/.idea/Mutual_Fund.iml
index 3fbabf5..7b59439 100644
--- a/.idea/Mutual_Fund.iml
+++ b/.idea/Mutual_Fund.iml
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 7440d61..34dc9d9 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,5 @@
-
+
\ No newline at end of file
diff --git a/api/router.py b/api/router.py
index f199e06..3d132d6 100644
--- a/api/router.py
+++ b/api/router.py
@@ -3,7 +3,9 @@
"""
from fastapi import APIRouter
-from api.routers import auth
+from api.routers import auth, product, questionnaire
api_router = APIRouter()
api_router.include_router(auth.router, prefix="/api", tags=["认证"])
+api_router.include_router(product.router, prefix="/api", tags=["产品"])
+api_router.include_router(questionnaire.router, prefix="/api", tags=["问卷"])
diff --git a/api/routers/auth.py b/api/routers/auth.py
index df51975..0bb0891 100644
--- a/api/routers/auth.py
+++ b/api/routers/auth.py
@@ -1,12 +1,13 @@
-"""认证路由:登录 + 当前用户(业务在 service/auth.py,路由只做编排)。"""
+"""认证路由:登录 + 注册 + 当前用户(业务在 service/auth.py,路由只做编排)。"""
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from api.deps import get_current_user
from config.deps import get_db
from model.sys_user import SysUser
-from schemas.auth import LoginReq
+from schemas.auth import LoginReq, RegisterReq
from service.auth import login as auth_login
+from service.auth import register as auth_register
from service.auth import user_payload
from utils.response import success
@@ -18,7 +19,14 @@ async def login(body: LoginReq, db: AsyncSession = Depends(get_db)):
return success(await auth_login(db, body.username, body.password))
+@router.post("/auth/register")
+async def register(body: RegisterReq, db: AsyncSession = Depends(get_db)):
+ return success(
+ await auth_register(db, body.username, body.password, body.phone, body.real_name)
+ )
+
+
@router.get("/auth/me")
async def me(user: SysUser = Depends(get_current_user)):
"""受保护示例路由:任意接口加 Depends(get_current_user) 即获得当前用户。"""
- return success({"user": user_payload(user)})
\ No newline at end of file
+ return success({"user": user_payload(user)})
diff --git a/logs/error.log b/logs/error.log
index ddccd54..428d8f4 100644
--- a/logs/error.log
+++ b/logs/error.log
@@ -403,3 +403,854 @@ Traceback (most recent call last):
self._write_fut = self._loop._proactor.send(self._sock, data)
^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'send'
+2026-09-10 20:49:20,257 ERROR [-] api: unhandled error on /api/auth/login
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\auth.py", line 19, in login
+ return success(await auth_login(db, body.username, body.password))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\auth.py", line 68, in login
+ user = await SysUserRepo(db).get_by_username(username)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\sys_user.py", line 14, in get_by_username
+ return await self.db.scalar(select(SysUser).where(SysUser.username == username))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 504, in scalar
+ return await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2421, in scalar
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 984, in caching_sha2_password_auth
+ data = _auth.sha2_rsa_encrypt(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\_auth.py", line 144, in sha2_rsa_encrypt
+ raise RuntimeError(
+RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
+2026-09-10 20:50:16,723 ERROR [-] api: unhandled error on /api/auth/login
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+pymysql.err.OperationalError: (1049, "Unknown database 'memory'")
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\auth.py", line 19, in login
+ return success(await auth_login(db, body.username, body.password))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\auth.py", line 68, in login
+ user = await SysUserRepo(db).get_by_username(username)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\sys_user.py", line 14, in get_by_username
+ return await self.db.scalar(select(SysUser).where(SysUser.username == username))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 504, in scalar
+ return await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2421, in scalar
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
+ Connection._handle_dbapi_exception_noconnection(
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2450, in _handle_dbapi_exception_noconnection
+ raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1049, "Unknown database 'memory'")
+(Background on this error at: https://sqlalche.me/e/20/e3q8)
+2026-09-10 20:51:21,189 ERROR [-] api: unhandled error on /api/auth/login
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 952, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+pymysql.err.OperationalError: (1049, "Unknown database 'memory'")
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\auth.py", line 19, in login
+ return success(await auth_login(db, body.username, body.password))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\auth.py", line 68, in login
+ user = await SysUserRepo(db).get_by_username(username)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\sys_user.py", line 14, in get_by_username
+ return await self.db.scalar(select(SysUser).where(SysUser.username == username))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 504, in scalar
+ return await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2421, in scalar
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
+ Connection._handle_dbapi_exception_noconnection(
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2450, in _handle_dbapi_exception_noconnection
+ raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 952, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1049, "Unknown database 'memory'")
+(Background on this error at: https://sqlalche.me/e/20/e3q8)
+2026-09-10 21:54:16,943 ERROR [-] api: unhandled error on /api/products
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\product.py", line 26, in products
+ data = await list_products(
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\product.py", line 54, in list_products
+ items, total = await ProductRepo(db).search(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\product.py", line 64, in search
+ items = list((await self.db.scalars(stmt)).all())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 561, in scalars
+ result = await self.execute(
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 448, in execute
+ result = await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2373, in execute
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
+ Connection._handle_dbapi_exception_noconnection(
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2450, in _handle_dbapi_exception_noconnection
+ raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
+(Background on this error at: https://sqlalche.me/e/20/e3q8)
diff --git a/logs/info.log b/logs/info.log
index e25fec3..7a4fbc2 100644
--- a/logs/info.log
+++ b/logs/info.log
@@ -412,3 +412,854 @@ Traceback (most recent call last):
self._write_fut = self._loop._proactor.send(self._sock, data)
^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'send'
+2026-09-10 20:49:20,257 ERROR [-] api: unhandled error on /api/auth/login
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\auth.py", line 19, in login
+ return success(await auth_login(db, body.username, body.password))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\auth.py", line 68, in login
+ user = await SysUserRepo(db).get_by_username(username)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\sys_user.py", line 14, in get_by_username
+ return await self.db.scalar(select(SysUser).where(SysUser.username == username))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 504, in scalar
+ return await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2421, in scalar
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 984, in caching_sha2_password_auth
+ data = _auth.sha2_rsa_encrypt(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\_auth.py", line 144, in sha2_rsa_encrypt
+ raise RuntimeError(
+RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
+2026-09-10 20:50:16,723 ERROR [-] api: unhandled error on /api/auth/login
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+pymysql.err.OperationalError: (1049, "Unknown database 'memory'")
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\auth.py", line 19, in login
+ return success(await auth_login(db, body.username, body.password))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\auth.py", line 68, in login
+ user = await SysUserRepo(db).get_by_username(username)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\sys_user.py", line 14, in get_by_username
+ return await self.db.scalar(select(SysUser).where(SysUser.username == username))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 504, in scalar
+ return await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2421, in scalar
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
+ Connection._handle_dbapi_exception_noconnection(
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2450, in _handle_dbapi_exception_noconnection
+ raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1049, "Unknown database 'memory'")
+(Background on this error at: https://sqlalche.me/e/20/e3q8)
+2026-09-10 20:51:21,189 ERROR [-] api: unhandled error on /api/auth/login
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 952, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+pymysql.err.OperationalError: (1049, "Unknown database 'memory'")
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\auth.py", line 19, in login
+ return success(await auth_login(db, body.username, body.password))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\auth.py", line 68, in login
+ user = await SysUserRepo(db).get_by_username(username)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\sys_user.py", line 14, in get_by_username
+ return await self.db.scalar(select(SysUser).where(SysUser.username == username))
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 504, in scalar
+ return await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2421, in scalar
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
+ Connection._handle_dbapi_exception_noconnection(
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2450, in _handle_dbapi_exception_noconnection
+ raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 952, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1049, "Unknown database 'memory'")
+(Background on this error at: https://sqlalche.me/e/20/e3q8)
+2026-09-10 21:54:16,943 ERROR [-] api: unhandled error on /api/products
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
+ await self.app(scope, receive, _send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 193, in __call__
+ response = await self.dispatch_func(request, call_next)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\utils\request_id.py", line 28, in dispatch
+ response: Response = await call_next(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 168, in call_next
+ raise app_exc from app_exc.__cause__ or app_exc.__context__
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
+ await self.app(scope, receive_or_disconnect, send_no_error)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
+ await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\middleware\asyncexitstack.py", line 18, in __call__
+ await self.app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\routing.py", line 670, in __call__
+ await self.middleware_stack(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2734, in app
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1791, in _handle_selected
+ await route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1780, in handle
+ await self.original_router.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 2789, in handle
+ await included_router._handle_selected(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1800, in _handle_selected
+ await original_route.handle(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 1279, in handle
+ await app(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 158, in app
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
+ raise exc
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
+ await app(scope, receive, sender)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 144, in app
+ response = await f(request)
+ ^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 706, in app
+ raw_response = await run_endpoint_function(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\fastapi\routing.py", line 352, in run_endpoint_function
+ return await dependant.call(**values)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\api\routers\product.py", line 26, in products
+ data = await list_products(
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\service\product.py", line 54, in list_products
+ items, total = await ProductRepo(db).search(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\repositories\product.py", line 64, in search
+ items = list((await self.db.scalars(stmt)).all())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 561, in scalars
+ result = await self.execute(
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 448, in execute
+ result = await greenlet_spawn(
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 201, in greenlet_spawn
+ result = context.throw(*sys.exc_info())
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2373, in execute
+ return self._execute_internal(
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2261, in _execute_internal
+ conn = self._connection_for_bind(bind)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2113, in _connection_for_bind
+ return trans._connection_for_bind(engine, execution_options)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "", line 2, in _connection_for_bind
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 137, in _go
+ ret_value = fn(self, *arg, **kw)
+ ^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1191, in _connection_for_bind
+ conn = bind.connect()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3295, in connect
+ return self._connection_cls(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in __init__
+ Connection._handle_dbapi_exception_noconnection(
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 2450, in _handle_dbapi_exception_noconnection
+ raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 144, in __init__
+ self._dbapi_connection = engine.raw_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3319, in raw_connection
+ return self.pool.connect()
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 448, in connect
+ return _ConnectionFairy._checkout(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1272, in _checkout
+ fairy = _ConnectionRecord.checkout(pool)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout
+ rec = pool._do_get()
+ ^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 178, in _do_get
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 176, in _do_get
+ return self._create_connection()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 389, in _create_connection
+ return _ConnectionRecord(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in __init__
+ self.__connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect
+ with util.safe_reraise():
+ ^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 122, in __exit__
+ raise exc_value.with_traceback(exc_tb)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect
+ self.dbapi_connection = connection = pool._invoke_creator(self)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 667, in connect
+ return dialect.connect(*cargs_tup, **cparams)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 630, in connect
+ return self.loaded_dbapi.connect(*cargs, **cparams) # type: ignore[no-any-return] # NOQA: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\dialects\mysql\aiomysql.py", line 176, in connect
+ await_only(creator_fn(*arg, **kw)),
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 132, in await_only
+ return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 196, in greenlet_spawn
+ value = await result
+ ^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 74, in _connect
+ await conn._connect()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 540, in _connect
+ await self._request_authentication()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 865, in _request_authentication
+ await self.caching_sha2_password_auth(auth_packet)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 989, in caching_sha2_password_auth
+ pkt = await self._read_packet()
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\aiomysql\connection.py", line 652, in _read_packet
+ packet.raise_for_error()
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error
+ err.raise_mysql_exception(self._data)
+ File "C:\Users\Windows\PycharmProjects\Mutual_Fund\.venv\Lib\site-packages\pymysql\err.py", line 154, in raise_mysql_exception
+ raise errorclass(errno, errval, sqlstate=sqlstate)
+sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
+(Background on this error at: https://sqlalche.me/e/20/e3q8)
diff --git a/repositories/sys_user.py b/repositories/sys_user.py
index d8dc4a4..5304dc5 100644
--- a/repositories/sys_user.py
+++ b/repositories/sys_user.py
@@ -11,4 +11,7 @@ class SysUserRepo(BaseRepository):
model = SysUser
async def get_by_username(self, username: str) -> SysUser | None:
- return await self.db.scalar(select(SysUser).where(SysUser.username == username))
\ No newline at end of file
+ return await self.db.scalar(select(SysUser).where(SysUser.username == username))
+
+ async def get_by_phone(self, phone: str) -> SysUser | None:
+ return await self.db.scalar(select(SysUser).where(SysUser.phone == phone))
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 55494c7..0fc9de2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,12 +1,10 @@
-fastapi
-uvicorn
-httpx
-pyjwt
-pydantic
-pydantic-settings
-sqlalchemy
-aiomysql
-redis
-pymilvus
-neo4j
-python-dotenv
\ No newline at end of file
+fastapi~=0.141.1
+sqlalchemy~=2.0.52
+httpx~=0.28.1
+pydantic~=2.13.5
+starlette~=1.6.0
+neo4j~=6.3.0
+redis~=8.1.0
+pymilvus~=3.0.1
+pydantic-settings~=2.15.0
+pyjwt~=2.13.0
\ No newline at end of file
diff --git a/schemas/auth.py b/schemas/auth.py
index 0084476..6c8f08b 100644
--- a/schemas/auth.py
+++ b/schemas/auth.py
@@ -4,4 +4,11 @@ from pydantic import BaseModel, Field
class LoginReq(BaseModel):
username: str = Field(min_length=1, max_length=64)
- password: str = Field(min_length=1, max_length=128)
\ No newline at end of file
+ password: str = Field(min_length=1, max_length=128)
+
+
+class RegisterReq(BaseModel):
+ username: str = Field(min_length=1, max_length=64)
+ password: str = Field(min_length=8, max_length=128, description="密码至少 8 位")
+ phone: str = Field(pattern=r"^1\d{10}$", description="11 位手机号")
+ real_name: str | None = Field(default=None, max_length=32)
\ No newline at end of file
diff --git a/service/auth.py b/service/auth.py
index 3ca1a2e..2d47c7e 100644
--- a/service/auth.py
+++ b/service/auth.py
@@ -70,4 +70,30 @@ async def login(db: AsyncSession, username: str, password: str) -> dict:
raise ParamError("用户名或密码错误")
if user.status != "正常":
raise ForbiddenError("账号状态异常,无法登录")
- return {"token": create_token(user.id), "user": user_payload(user)}
\ No newline at end of file
+ return {"token": create_token(user.id), "user": user_payload(user)}
+
+
+async def register(
+ db: AsyncSession,
+ username: str,
+ password: str,
+ phone: str,
+ real_name: str | None = None,
+) -> dict:
+ """客户注册:唯一性校验 → 密码加密存储 → 返回用户信息(不自动签发 token)。"""
+ repo = SysUserRepo(db)
+ if await repo.get_by_username(username) is not None:
+ raise ParamError("用户名已存在")
+ if await repo.get_by_phone(phone) is not None:
+ raise ParamError("手机号已注册")
+
+ user = SysUser(
+ username=username,
+ password_hash=hash_password(password),
+ phone=phone,
+ real_name=real_name,
+ user_type="CUSTOMER",
+ status="正常",
+ )
+ user = await repo.add(user)
+ return user_payload(user)
\ No newline at end of file
diff --git a/sql/schema.sql b/sql/schema.sql
index f2d3f68..ac56327 100644
--- a/sql/schema.sql
+++ b/sql/schema.sql
@@ -59,7 +59,6 @@ CREATE TABLE IF NOT EXISTS fin_product (
expected_return DECIMAL(7,4) NULL COMMENT '预期年化收益率(%)',
nav DECIMAL(12,6) NULL COMMENT '最新单位净值',
nav_date DATE NULL COMMENT '净值日期',
- min_amount DECIMAL(16,2) NOT NULL DEFAULT 10.00 COMMENT '起投金额(元)',
fee_rate DECIMAL(6,4) NOT NULL DEFAULT 0.0000 COMMENT '申购费率(%)',
term_days INT NOT NULL DEFAULT 0 COMMENT '产品期限天数,0=活期(开放申赎)',
fund_manager VARCHAR(64) NULL COMMENT '基金经理',