sqlalchemy-firebird icon indicating copy to clipboard operation
sqlalchemy-firebird copied to clipboard

Bug: TypeError in sqlalchemy_firebird when using first() after upgrading to SQLAlchemy 2.0.40

Open YANGSROOT opened this issue 10 months ago • 4 comments

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 for s in (c._compiler_dispatch(self, **kw) for c in clauses) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 2789, in for s in (c._compiler_dispatch(self, **kw) for c in clauses) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 3429, in visit_binary return self._generate_generic_binary( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 3488, in _generate_generic_binary + binary.right._compiler_dispatch( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 3823, in visit_bindparam ret = self.bindparam_string( ^^^^^^^^^^^^^^^^^^^^^^ File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 4011, in bindparam_string ret = self.render_bind_cast(bindparam_type, type_impl, ret) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy_firebird\base.py", line 39, in render_bind_cast self.dialect.type_compiler_instance.process( File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 977, in process return type._compiler_dispatch(self, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 7338, in visit_string return self.visit_VARCHAR(type, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 7264, in visit_VARCHAR return self._render_string_type( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\e5001\backend\venv\Lib\site-packages\sqlalchemy_firebird\base.py", line 425, in _render_string_type text = text + (length and "(%d)" % length or "") ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TypeError: unsupported operand type(s) for +: 'int' and 'str'

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

YANGSROOT avatar Apr 04 '25 13:04 YANGSROOT

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?

pauldex avatar Apr 05 '25 15:04 pauldex

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

YANGSROOT avatar Apr 06 '25 00:04 YANGSROOT

That's what it looks like.

pauldex avatar Apr 07 '25 01:04 pauldex

#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.

fdcastel avatar Jul 03 '25 05:07 fdcastel