From a09731262028d98315be1709c9047a6e7b66b7e0 Mon Sep 17 00:00:00 2001 From: TheEssem Date: Fri, 10 Jul 2020 13:31:06 -0500 Subject: [PATCH] Add script to migrate database from MongoDB to PostgreSQL --- convertdb.js | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 convertdb.js diff --git a/convertdb.js b/convertdb.js new file mode 100644 index 0000000..ec305aa --- /dev/null +++ b/convertdb.js @@ -0,0 +1,76 @@ +require("dotenv").config(); +const { promisify } = require("util"); +const { writeFile } = require("fs"); +const { Pool } = require("pg"); +const pool = new Pool({ + user: "esmbot", + host: "localhost", + database: "esmbot", + port: 5432 +}); +const mongoose = require("mongoose"); +mongoose.connect(process.env.MONGO, { poolSize: 10, bufferMaxEntries: 0, reconnectTries: 5000, useNewUrlParser: true, useUnifiedTopology: true }); +const guildSchema = new mongoose.Schema({ + id: String, + tags: Map, + prefix: String, + warns: Map, + disabledChannels: [String] +}); +const Guild = mongoose.model("Guild", guildSchema); + +const tweetSchema = new mongoose.Schema({ + tweets: [String], + replies: [String], + media: [String], + phrases: [String], + games: [String], + characters: [String], + download: [String], + enabled: Boolean +}); +const TweetCollection = mongoose.model("TweetCollection", tweetSchema); + +const globalSchema = new mongoose.Schema({ + cmdCounts: Map +}); +const Global = mongoose.model("Global", globalSchema); + +(async () => { + console.log("Migrating guilds..."); + const guilds = await Guild.find(); + try { + await pool.query("CREATE TABLE guilds ( guild_id VARCHAR(30) NOT NULL, tags json NOT NULL, prefix VARCHAR(15) NOT NULL, warns json NOT NULL, disabled text ARRAY NOT NULL )"); + } catch { + console.log("Skipping table creation due to error..."); + } + for (const guild of guilds) { + if ((await pool.query("SELECT * FROM guilds WHERE guild_id = $1", [guild.id])).rows.length !== 0) { + await pool.query("UPDATE guilds SET tags = $1, prefix = $2, warns = $3, disabled = $4 WHERE guild_id = $5", [guild.tags, guild.prefix, guild.warns, guild.disabledChannels, guild.id]); + } else { + await pool.query("INSERT INTO guilds (guild_id, tags, prefix, warns, disabled) VALUES ($1, $2, $3, $4, $5)", [guild.id, guild.tags, guild.prefix, guild.warns, guild.disabledChannels]); + } + console.log(`Migrated guild with ID ${guild.id}`); + } + console.log("Migrating Tweets..."); + const tweets = await TweetCollection.find(); + await promisify(writeFile)("../tweets.json", JSON.stringify(tweets, null, 2)); + console.log("Migrating command counts..."); + const global = await Global.findOne(); + try { + await pool.query("CREATE TABLE counts ( command VARCHAR NOT NULL, count integer NOT NULL )"); + } catch { + console.log("Skipping table creation due to error..."); + } + console.log(global); + for (const [key, value] of global.cmdCounts) { + if ((await pool.query("SELECT * FROM counts WHERE command = $1", [key])).rows.length !== 0) { + await pool.query("UPDATE counts SET count = $1 WHERE command = $2", [value, key]); + } else { + await pool.query("INSERT INTO counts (command, count) VALUES ($1, $2)", [key, value]); + } + console.log(`Migrated counts for command ${key}`); + } + console.log("Done!"); + return; +})(); \ No newline at end of file