diff --git a/util/scripts/migrate_db_engine.js b/util/scripts/migrate_db_engine.js
new file mode 100644
index 00000000..79e9d86f
--- /dev/null
+++ b/util/scripts/migrate_db_engine.js
@@ -0,0 +1,109 @@
+const { config } = require("dotenv");
+config();
+const { createConnection } = require("typeorm");
+const { initDatabase } = require("../../dist/util/Database");
+require("missing-native-js-functions");
+const {
+ Application,
+ Attachment,
+ Ban,
+ Channel,
+ ConfigEntity,
+ ConnectedAccount,
+ Emoji,
+ Guild,
+ Invite,
+ Member,
+ Message,
+ ReadState,
+ Recipient,
+ Relationship,
+ Role,
+ Sticker,
+ Team,
+ TeamMember,
+ Template,
+ User,
+ VoiceState,
+ Webhook,
+} = require("../../dist/entities/index");
+
+async function main() {
+ if (!process.env.TO) throw new Error("TO database env connection string not set");
+
+ // manually arrange them because of foreign keys
+ const entities = [
+ ConfigEntity,
+ User,
+ Guild,
+ Channel,
+ Invite,
+ Role,
+ Ban,
+ Application,
+ Emoji,
+ ConnectedAccount,
+ Member,
+ ReadState,
+ Recipient,
+ Relationship,
+ Sticker,
+ Team,
+ TeamMember,
+ Template,
+ VoiceState,
+ Webhook,
+ Message,
+ Attachment,
+ ];
+
+ const oldDB = await initDatabase();
+
+ const type = process.env.TO.includes("://") ? process.env.TO.split(":")[0]?.replace("+srv", "") : "sqlite";
+ const isSqlite = type.includes("sqlite");
+
+ // @ts-ignore
+ const newDB = await createConnection({
+ type,
+ url: isSqlite ? undefined : process.env.TO,
+ database: isSqlite ? process.env.TO : undefined,
+ entities,
+ name: "new",
+ synchronize: true,
+ });
+ let i = 0;
+
+ try {
+ for (const entity of entities) {
+ const entries = await oldDB.manager.find(entity);
+
+ // @ts-ignore
+ console.log("migrating " + entries.length + " " + entity.name + " ...");
+
+ for (const entry of entries) {
+ console.log(i++);
+
+ try {
+ await newDB.manager.insert(entity, entry);
+ } catch (error) {
+ try {
+ if (!entry.id) throw new Error("object doesn't have a unique id: " + entry);
+ await newDB.manager.update(entity, { id: entry.id }, entry);
+ } catch (error) {
+ console.error("couldn't migrate " + i + " " + entity.name, error);
+ }
+ }
+ }
+
+ // @ts-ignore
+ console.log("migrated " + entries.length + " " + entity.name);
+ }
+ } catch (error) {
+ console.error(error.message);
+ }
+
+ console.log("SUCCESS migrated all data");
+ await newDB.close();
+}
+
+main().caught();
|