У меня есть следующий упрощенный скрипт, который пытается автоматически создавать сообщения для существующего пользователя. Содержимое сообщения вставляется через bindparam.
Traceback (most recent call last):
File "app/backend/sqlalc.py", line 61, in
session.execute(stmt, {'content': 'Auto-generated post.'})
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2365, in execute
return self._execute_internal(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2251, in _execute_internal
result: Result[Any] = compile_state_cls.orm_execute_statement(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1280, in orm_execute_statement
result = _bulk_insert(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 222, in _bulk_insert
result = persistence._emit_insert_statements(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 1048, in _emit_insert_statements
result = connection.execute(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1416, in execute
return meth(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 516, in _execute_on_connection
return connection._execute_clauseelement(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1630, in _execute_clauseelement
compiled_sql, extracted_params, cache_hit = elem._compile_w_cache(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 704, in _compile_w_cache
compiled_sql = self._compiler(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 317, in _compiler
return dialect.statement_compiler(dialect, self, **kw)
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 1429, in __init__
Compiled.__init__(self, dialect, statement, **kwargs)
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 870, in __init__
self.string = self.process(self.statement, **compile_kwargs)
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 915, in process
return obj._compiler_dispatch(self, **kwargs)
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/annotation.py", line 344, in _compiler_dispatch
return self.__element.__class__._compiler_dispatch(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/visitors.py", line 141, in _compiler_dispatch
return meth(self, **kw) # type: ignore # noqa: E501
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 5746, in visit_insert
compile_state = insert_stmt._compile_state_factory(
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/base.py", line 683, in create_for_statement
return klass.create_for_statement(statement, compiler, **kw)
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1338, in create_for_statement
self._setup_for_bulk_insert(compiler)
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1385, in _setup_for_bulk_insert
self._dict_parameters = {
File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1388, in
if col.table is emit_insert_table
AttributeError: 'str' object has no attribute 'table'
Но если бы я удалил параметр связывания следующим образом:
У меня есть следующий упрощенный скрипт, который пытается автоматически создавать сообщения для существующего пользователя. Содержимое сообщения вставляется через bindparam. [code]from sqlalchemy import String, ForeignKey, Integer, bindparam, create_engine, insert, select from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, Session
session.commit() [/code] Когда я пытаюсь запустить скрипт, я получаю следующую ошибку: [code]Traceback (most recent call last): File "app/backend/sqlalc.py", line 61, in session.execute(stmt, {'content': 'Auto-generated post.'}) File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2365, in execute return self._execute_internal( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2251, in _execute_internal result: Result[Any] = compile_state_cls.orm_execute_statement( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1280, in orm_execute_statement result = _bulk_insert( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 222, in _bulk_insert result = persistence._emit_insert_statements( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/persistence.py", line 1048, in _emit_insert_statements result = connection.execute( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1416, in execute return meth( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 516, in _execute_on_connection return connection._execute_clauseelement( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1630, in _execute_clauseelement compiled_sql, extracted_params, cache_hit = elem._compile_w_cache( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 704, in _compile_w_cache compiled_sql = self._compiler( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 317, in _compiler return dialect.statement_compiler(dialect, self, **kw) File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 1429, in __init__ Compiled.__init__(self, dialect, statement, **kwargs) File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 870, in __init__ self.string = self.process(self.statement, **compile_kwargs) File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 915, in process return obj._compiler_dispatch(self, **kwargs) File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/annotation.py", line 344, in _compiler_dispatch return self.__element.__class__._compiler_dispatch( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/visitors.py", line 141, in _compiler_dispatch return meth(self, **kw) # type: ignore # noqa: E501 File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/compiler.py", line 5746, in visit_insert compile_state = insert_stmt._compile_state_factory( File "app/venv39/lib/python3.9/site-packages/sqlalchemy/sql/base.py", line 683, in create_for_statement return klass.create_for_statement(statement, compiler, **kw) File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1338, in create_for_statement self._setup_for_bulk_insert(compiler) File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1385, in _setup_for_bulk_insert self._dict_parameters = { File "app/venv39/lib/python3.9/site-packages/sqlalchemy/orm/bulk_persistence.py", line 1388, in if col.table is emit_insert_table AttributeError: 'str' object has no attribute 'table' [/code] Но если бы я удалил параметр связывания следующим образом: [code] stmt = ( insert(Post) .from_select( ["title", "content", "author_id"], select( ("Post for " + cte_even_user.c.username).label("title"), cte_even_user.c.username.label("content"), cte_even_user.c.id.label("author_id") ) .select_from(cte_even_user) ) ) [/code] Тогда это работает. Я неправильно использую параметр связывания?