1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-11-25 03:33:33 +01:00

db migrate script

This commit is contained in:
Flam3rboy 2021-10-04 23:14:03 +02:00
parent 7b63016872
commit cb0885dd71
3 changed files with 52 additions and 4 deletions

View File

@ -15,7 +15,7 @@ import "missing-native-js-functions";
// btw. we don't use class-validator for everything, because we need to explicitly set the type instead of deriving it from typescript also it doesn't easily support nested objects
export class BaseClassWithoutId extends BaseEntity {
constructor(private props?: any) {
constructor(props?: any) {
super();
this.assign(props);
}
@ -56,7 +56,6 @@ export class BaseClassWithoutId extends BaseEntity {
@BeforeUpdate()
@BeforeInsert()
validate() {
this.assign(this.props);
return this;
}

View File

@ -0,0 +1,47 @@
import { config } from "dotenv";
config();
import * as Models from "../entities";
import { User } from "../entities/User";
import { createConnection, Connection } from "typeorm";
import { initDatabase } from "../util/Database";
import "missing-native-js-functions";
async function main() {
if (!process.env.FROM) throw new Error("FROM database env connection string not set");
// @ts-ignore
const entities = Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name);
const newDB = await initDatabase();
// @ts-ignore
const oldDB = await createConnection({
type: process.env.FROM.split(":")[0]?.replace("+srv", ""),
url: process.env.FROM,
entities,
name: "old",
});
await Promise.all(
entities.map(async (x) => {
const data = await oldDB.manager.find(User);
await Promise.all(
data.map(async (x) => {
try {
await newDB.manager.insert(User, x);
} catch (error) {
if (!x.id) throw new Error("object doesn't have a unique id: " + x);
await newDB.manager.update(User, { id: x.id }, x);
}
})
);
// @ts-ignore
console.log("migrated all " + x.name);
})
);
console.log("SUCCESS migrated all data");
}
main().caught();

View File

@ -11,7 +11,7 @@ var promise: Promise<any>;
var dbConnection: Connection | undefined;
let dbConnectionString = process.env.DATABASE || path.join(process.cwd(), "database.db");
export function initDatabase() {
export function initDatabase(): Promise<Connection> {
if (promise) return promise; // prevent initalizing multiple times
const type = dbConnectionString.includes(":") ? dbConnectionString.split(":")[0]?.replace("+srv", "") : "sqlite";
@ -23,7 +23,8 @@ export function initDatabase() {
type,
url: isSqlite ? undefined : dbConnectionString,
database: isSqlite ? dbConnectionString : undefined,
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object"),
// @ts-ignore
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name),
synchronize: type !== "mongodb",
logging: false,
cache: {
@ -31,6 +32,7 @@ export function initDatabase() {
},
bigNumberStrings: false,
supportBigNumbers: true,
name: "default",
});
promise.then((connection) => {