我们刚刚使用follower changeover方法升级了Heroku postgres数据库。我们有超过50个dataclips附加到旧数据库,现在我们需要将它们移动到新数据库。但是,逐个完成它们会花费很多时间。
是否有一种编程方式来更新数据夹附加的数据库,可能使用CLI工具?
答案 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进行逆向工程)。
https://dataclips.heroku.com/api/v1/clips
)返回所有数据条目的网络调用。采取此响应并提取所有dataclip slugs。https://dataclips.heroku.com/api/v1/clips/:slug/move
)。右键单击,复制为cURL。这是获取所有正确参数的最简单方法,因为API使用cookie进行身份验证。编写一个循环遍历每个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。