Das einzige Problem wird sein, wenn Sie mit den Benutzernamen, die das Skript auswählt, unzufrieden sind. Wenn es Ihnen also egal ist, wenn so etwas passiert:
clan|nickname → clan_nickname
[clan]nickname → clan_nickname2
dann sind Sie wahrscheinlich in Ordnung, und es erscheint ziemlich unwahrscheinlich, dass Sie zwei Personen im selben Clan mit demselben Spitznamen, aber unterschiedlichen zusätzlichen Zeichen haben werden, daher denke ich, dass Sie wahrscheinlich in Ordnung sein werden.
Leider mussten wir unser gesamtes Migrationsskript selbst erstellen. Das zu diesem Zeitpunkt (Ende 2022) verfügbare Skript war definitiv noch nicht einmal in einem „fertigen“ Zustand. Teile des referenzierten Codes fehlten und andere ergaben überhaupt keinen Sinn.
Zu den Teilen, mit denen wir uns befassen mussten, gehörte die Umbenennung von Benutzernamen, die nicht dem Discourse-Standard entsprachen. Wir hatten über 10.000 Benutzer, also wiesen wir den Benutzernamen einfach dem Feld „Benutzername“ zu, das keine solchen Einschränkungen hat, und wenn ein Benutzername gegen eine der Regeln verstieß, änderten wir ihn in den md5-String des Benutzernamens. Dann ließen wir den Benutzern einen Monat Zeit, ihren Benutzernamen frei zu ändern, damit sie ihn wieder in etwas ändern konnten, das ihrem ursprünglichen ähnelte.
Hier ist ein Auszug aus dem Code:
public static string ParseName(string text)
{
var reservedName = new string[] { "user", "system", "moderators" };
var result = NormalizeText(text);
// Wenn reserviert, ändern Sie es
if (reservedName.Contains(result, StringComparer.OrdinalIgnoreCase))
result = text.ToLower().ToMD5();
// Ungültige alphanumerische Zeichen
else if (!Regex.IsMatch(result, @ "^[a-zA-Z0-9_.-]*$"))
result = text.ToLower().ToMD5();
// Ungültige wiederholte Zeichen
else if (Regex.IsMatch(result, @ "[-_.]{2,}"))
result = text.ToLower().ToMD5();
// Ungültiges abschließendes Zeichen
else if (Regex.IsMatch(result, @ "/[\p{L}\p{N}]+$/"))
result = text.ToLower().ToMD5();
// Verwirrende Erweiterungen
else if (Regex.IsMatch(result, @ "/\.(js|json|css|htm|html|xml|jpg|jpeg|png|gif|bmp|ico|tif|tiff|woff)$/i"))
result = text.ToLower().ToMD5();
// Start- und Endpunkte
else if (result.StartsWith(".") || result.EndsWith("."))
result = text.ToLower().ToMD5();
// Nicht mehr als 60 Zeichen
result = result.Truncate(60);
return result;
}
Wir haben diese Datei als Referenz verwendet, um festzustellen, was als Einschränkung gilt. Möglicherweise wurde sie inzwischen geändert, also behalten Sie sie im Auge.
Nein, wir sind vom Skript abgewichen, da es extrem langsam bei der Verarbeitung eines Forums mit über 10 Millionen Antworten war.
Wir haben alles von Grund auf in C# neu erstellt. Es dauerte etwa 4-5 Stunden, alles außer Avataren zu migrieren und Weiterleitungen zu erstellen, um die unterschiedlichen URL-Formate abzugleichen. Ein zweiter Durchlauf des Skripts mit einem spezifischen Parameter würde auch die Avatare für jeden aktiven Benutzer der letzten 6 Monate aktualisieren und alle notwendigen Weiterleitungen hinzufügen, indem die Antworten gescannt und nach dem alten URL-Format gesucht wird.
Das dauerte mehr oder weniger ein paar Tage, aber es war etwas, das im Hintergrund passieren konnte, da das Wichtigste für uns war, das Forum mit allen Inhalten in weniger als einem Tag am Laufen zu haben.
FWIW, die vorhandenen Skripte überspringen vorhandene Inhalte, sodass der endgültige Import wahrscheinlich unter einer Stunde gedauert hätte, insbesondere wenn Sie ihm das Datum der zuletzt importierten Daten mitgeteilt hätten. Der erste Durchlauf wäre jedoch sehr schmerzhaft gewesen.
Ja, ich weiß, es wurde auch wieder aufgenommen, aber einige alte Inhalte waren so durcheinander (das Forum hatte eine Migration Anfang der 2000er Jahre), dass das Skript meistens fehlschlug oder sehr schnell sehr langsam wurde.
Glauben Sie mir, wenn wir 3 Monate Schreiben und Testen hätten vermeiden können, hätten wir es getan!