Результат выполнения select в курсоре, как и fetchall() выдает не просто кортеж, а вложенный кортеж, т.е.
((ряд1значение1, ряд1значение2, ряд1значение3... ), (ряд2значение1, ряд2значение2, ряд2значение3... ), ...)
соответственно нужно дополнительно join складывать значения ряда в строку, а затем строки рядов в строку.
result2 = '\n'.join(' ║ '.join(f'{val}' for val in row) for row in cur.execute(f"SELECT * FROM {arg}"))
А если нужно, чтобы это было выровнено, то можно сначала считать данные, затем вычислить в каждом столбце самое длинное значение, и затем уже вывести, отформатировав по наибольшему.