Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict'
- const { Client } = require('pg')
- const table = process.argv[2]
- const limit = parseInt(process.argv[3], 10) || 0
- const st = parseInt(process.argv[4], 10) || 0
- console.log(table, limit)
- const db = new Client({
- host: "db2.eu.skies.zone",
- user: "postgres",
- password: "fFVejV2QgEIc7RWA5DyE",
- database: "skies_0"
- })
- const backup = new Client({
- host: "localhost",
- user: "postgres",
- password: "",
- database: "skies_backup"
- })
- async function start() {
- await db.connect()
- await backup.connect()
- let total = limit
- if (!total) {
- const count = await db.query(`SELECT COUNT(*) FROM "${ table }"`)
- total = parseInt(count.rows[0].count, 10)
- }
- console.log(`Prepare to migrate ${ total } rows`)
- let offset = st
- const ranges = []
- while (offset < total) {
- ranges.push([offset, 1])
- offset += 1
- }
- let completed = 0
- const damaged = []
- while (ranges.length) {
- const [offset, limit] = ranges.shift()
- try {
- console.log(`Checking range ${ offset }-${ offset + limit }`)
- const res = await db.query(`SELECT * FROM "${ table }" OFFSET $1::numeric LIMIT $2::numeric`, [offset, limit])
- completed += res.rows.length
- await insert(backup, table, res.rows)
- console.log(`Completed ${ completed }`)
- } catch (e) {
- console.error(e.message)
- if (limit === 1) {
- damaged.push(offset)
- continue
- }
- const l = Math.floor(limit / 2)
- ranges.unshift([offset, l], [offset + l, limit - l])
- }
- }
- console.log(`Completed: ${ completed }, damaged: ${ damaged.length }`)
- console.log(`Damaged rows: ${ damaged.join(', ') }`)
- await backup.end()
- await db.end()
- }
- start().catch(console.error.bind(console))
- function insert(db, table, payload) {
- const keys = Object.keys(payload[0])
- const values = []
- const data = []
- let ii = 1
- for (const item of payload) {
- const chunk = []
- for (const key of keys) {
- chunk.push(`$${ ii++ }`)
- data.push(item[key])
- }
- values.push(`(${ chunk.join(', ') })`)
- }
- return db.query(`INSERT INTO ${ table }(${ keys.join(", ") }) VALUES ${ values.join(", ") }`, data)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement