Bug: TypeError in sqlalchemy_firebird when using first() after upgrading to SQLAlchemy 2.0.40
The following is the error message:
Traceback (most recent call last):
File "D:\e5001\backend\venv\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 403, in run_asgi
result = await app( # type: ignore[func-returns-value]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 60, in call
return await self.app(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\fastapi\applications.py", line 1054, in call
await super().call(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\applications.py", line 112, in call
await self.middleware_stack(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\middleware\errors.py", line 187, in call
raise exc
File "D:\e5001\backend\venv\Lib\site-packages\starlette\middleware\errors.py", line 165, in call
await self.app(scope, receive, _send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\middleware\cors.py", line 93, in call
await self.simple_response(scope, receive, send, request_headers=headers)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\middleware\cors.py", line 144, in simple_response
await self.app(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\middleware\exceptions.py", line 62, in call
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette_exception_handler.py", line 53, in wrapped_app
raise exc
File "D:\e5001\backend\venv\Lib\site-packages\starlette_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\routing.py", line 714, in call
await self.middleware_stack(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\routing.py", line 734, in app
await route.handle(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\routing.py", line 288, in handle
await self.app(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
File "D:\e5001\backend\venv\Lib\site-packages\starlette_exception_handler.py", line 53, in wrapped_app
raise exc
File "D:\e5001\backend\venv\Lib\site-packages\starlette_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
File "D:\e5001\backend\venv\Lib\site-packages\starlette\routing.py", line 73, in app
response = await f(request)
^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\fastapi\routing.py", line 301, in app
raw_response = await run_endpoint_function(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\fastapi\routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\app\modules\erp_auth\router.py", line 58, in login
Operator.PW == request.password).first()
^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2759, in first
return self.limit(1)._iter().first() # type: ignore
^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2858, in _iter
result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2365, in execute
return self._execute_internal(
^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2251, in _execute_internal
result: Result[Any] = compile_state_cls.orm_execute_statement(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\orm\context.py", line 306, in orm_execute_statement
result = conn.execute(
^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1416, in execute
return meth(
^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 523, in _execute_on_connection
return connection._execute_clauseelement(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1630, in _execute_clauseelement
compiled_sql, extracted_params, cache_hit = elem._compile_w_cache(
^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 711, in _compile_w_cache
compiled_sql = self._compiler(
^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 320, in _compiler
return dialect.statement_compiler(dialect, self, **kw)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 1446, in init
Compiled.init(self, dialect, statement, **kwargs)
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 886, in init
self.string = self.process(self.statement, **compile_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 932, in process
return obj._compiler_dispatch(self, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\visitors.py", line 141, in _compiler_dispatch
return meth(self, **kw) # type: ignore # noqa: E501
^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 4873, in visit_select
text = self._compose_select_body(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 5035, in _compose_select_body
t = self._generate_delimited_and_list(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 2787, in _generate_delimited_and_list
return separator.join(
^^^^^^^^^^^^^^^
File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 2789, in
Here is the code I wrote: db.query(Operator).filter( Operator.OPERATOR_NO == request.operator_id, Operator.PW == request.password).first()
python version:Python312 sqlalchemy-firebird version:2.1
When I use SQL Alchemy version 2.0.39, there will be no error messages
Thanks for your report. My understanding is that your code (Operator.PW == request.password).first()) works when with SQLAlchemy version 2.0.39 but not with 2.0.40. I'll look into what has changed.
What is the value of request.password).first() in the working and non-working versions of SQLAlchemy?
Sorry, due to the time zone difference, I just saw the answer
A string with a value of 123 for request.password
I am reporting an error with sqlalchemy-firebird/base-py text=text+(length and "(% d)"% length or "") Added print (text, length) on the previous line The output result of SQLAlchemy 2.0.39 is VARCHAR 30 VARCHAR 30 And in the SQLAlchemy 2.0.40 version The output result is 30 NONE
I'm thinking, is it a change in the version of SQLAlchemy that caused the values of function parameters to change
That's what it looks like.
#79 should fix this.
I'm thinking, is it a change in the version of SQLAlchemy that caused the values of function parameters to change
Yes. More details on #78.