engine.connect().execute(stmt).fetchone()
выглядит противоестественно. Скорее всего вы из-за этого получаете именованный кортеж, а он неизменяем. Попробуйте лучше так:with Session(engine) as session:
stmt = select(Questionnaire).where(Questionnaire.user == user_id)
questionnaire = session.scalars(stmt).one()
if questionnaire:
questionnaire.username = f'@{username}'
session.commit()