以编程方式更改heroku dataclips的数据库

时间:2014-12-19 22:04:20

标签: heroku heroku-postgres

我们刚刚使用follower changeover方法升级了Heroku postgres数据库。我们有超过50个dataclips附加到旧数据库,现在我们需要将它们移动到新数据库。但是,逐个完成它们会花费很多时间。

是否有一种编程方式来更新数据夹附加的数据库,可能使用CLI工具?

5 个答案:

答案 0 :(得分:4)

至少在旧数据库被取消配置后,您现在可以(截至2016年3月)将它们重新连接到另一个数据库:

转到https://dataclips.heroku.com/clips/recoverable。它将显示您的旧数据库和一组孤儿' dataclips,您可以选择将它们转移到另一个数据库(在我的情况下是转换中的推荐关注者)。

请注意,这只会影响创建的数据字段,会影响您创建的团队成员之一以及您只能访问的数据字段。所以他们也必须经历这个过程。

官方devcenter文章:https://devcenter.heroku.com/articles/dataclips#dataclip-recovery

答案 1 :(得分:2)

感谢Heroku CSRF措施,以编程方式更新数据剪辑比您预期的要困难得多。你需要吮吸它并开始手动点击按钮,或者请求他们的支持团队为你做这件事,这同样困难。


没有官方支持以编程方式移动dataclips。话虽这么说,你可以根据他们的HTTP API编写脚本。

基本网址为https://dataclips.heroku.com/api/v1/。有三个相关的终点:

  • 剪辑/clips
  • 资源(数据库)/heroku_resources
  • 移动剪辑/clips/:slug/move

找到要移动的剪辑的slug,找到新数据库的资源ID,并发布移动剪辑端点的帖子:

POST /api/v1/clips/fjhwieufysdufnjqqueyuiewsr/move
Content-Type: application/json

{"heroku_resource_id":"resource123456789@heroku.com"}

答案 2 :(得分:1)

我有超过300个dataclips要移动。我使用以下技术来更新它们(基本上是对dataclips API进行逆向工程)。

  1. 使用网络开发者工具“网络”标签打开Chrome。
  2. 登录Heroku Dataclips
  3. 观察以JSON(https://dataclips.heroku.com/api/v1/clips)返回所有数据条目的网络调用。采取此响应并提取所有dataclip slugs。
  4. 更新一个dataclip的数据库。观察执行此操作的网络调用(https://dataclips.heroku.com/api/v1/clips/:slug/move)。右键单击,复制为cURL。这是获取所有正确参数的最简单方法,因为API使用cookie进行身份验证。
  5. 编写一个循环遍历每个dataclip slug的脚本,并弹出卷曲。在Ruby中,这看起来像:

    slugs = <paste ids here>.split("\n")
    slugs.each do |slug|
      command = %Q(curl -v 'https://dataclips.heroku.com/api/v1/clips/#{slug}/move' -H 'Cookie: ...' --data '{"heroku_resource_id":"resource1234567@heroku.com"}')
      puts command
      system(command)
    end
    

答案 3 :(得分:0)

您可以联系Heroku支持人员,他们会将数据传输批量传输到您的新数据库。

答案 4 :(得分:0)

批量处理数据片段

我终于找到了一个解决方案,可以使用javascript控制台和一些剪贴技术批量处理Dataclips。我需要它来检索每个数据剪辑。但是它猜测可以这样更新:

// Go to the dataclip listing (https://data.heroku.com/dataclips).
// Then execute this script in your console.
// Be careful, this will focus a new window every 4 seconds, preventing
// you from working 4 seconds times the number of dataclips you have.

// Retrieve urls and titles
let dataclips = Array.
    from(document.querySelectorAll('.rt-td:first-child a')).
    map(el => ({ url: el.href, title: el.innerText }))


/**
 * Allows waiting for a given timeout before execution.
 * @param {number} seconds
 */
const timeout = function(seconds) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve()
        }, seconds);
    })
}

/**
 * Here are all the changes you want to apply to every single
 * dataclip.
 * @param {object} window
 */
const applyChanges = function(window) {
}

// With a fast connection, 4 seconds is OK. Dial it down if you
// have errors.
const expectedLoadTime = 4000 // ms

// This is the main loop, windows are opened one by one to ensure focus and a
// correct loading time.
for (const dataclip of dataclips) {
    // This opens another window from the script, having access to its DOM.
    // See https://github.com/buonomo/kazoo for a funnier example usage!
    // And don't be shy to star and share :D
    const externWindow = window.open(dataclip.url)
    // A hack to wait for loading, this could be improved for sure.
    await timeout(expectedLoadTime)
    
  applyChanges(externWindow)
  
    externWindow.close()
}

您仍然必须自己实现applyChanges,我认为这有点乏味,而且我没有时间知道(如果有,请分享!)。但是至少可以通过一个函数在所有数据片段上完成它。

有关此脚本的示例用法,您可以查看the gist I made to scrap every dataclips and related errors