Migrate an SMF2 forum to Discourse

Вы имеете в виду Postgres? Я не совсем понимаю, о чём речь.

Что я бы сделал: если ID пользователя равен 0, использовать имя пользователя в качестве ID. Затем, если функция find_username_by_import_id не находит пользователя, создать его, установив адрес электронной почты в fake_email (это функция в base.rb, которая генерирует фейковый адрес электронной почты), а имя пользователя — в то, которое у вас есть. Если вы амбициозны, в конце скрипта можно приостановить всех пользователей, у которых в адресе электронной почты содержится @email.invalid. Они не будут активны, поэтому, думаю, не так важно, приостановите вы их или нет.

Другой вариант — выполнить запрос, который каким-то образом сформирует список всех удалённых пользователей, и создать их перед началом обработки постов, но это кажется более сложным.

Если вы хотите создать пользователя с именем deleted user и сделать так, чтобы все эти посты принадлежали ему вместо system, вы можете это сделать, просто заменив -1 на номер пользователя deleted user. Вы можете создать его как обычного пользователя или пойти на хитрость и назначить ему ID пользователя -2 или что-то в этом роде.

В некоторых системах это происходит потому, что иногда вложения находятся в теле поста, а в других случаях запись о вложении хранится в базе данных.

Вы установили плагин Поддержка перенесённых хешей паролей после запуска импорта (он может мешать выполнению импорта по крайней мере в некоторых случаях)? Использует ли SMF2 хеширование паролей так же, как smf?