我正在使用在Heroku托管的nodejs(目前为止免费计划)。
我自动从其他地方获取数据(这部分工作正常,我得到JSON或CVS),我的目标是将它们添加到Prostresql数据库中。
虽然我是DB mangement和Postgresql的新手,但在发布之前我已经做了我的研究。我知道存在COPY命令,以及如何INSERT多个数据没有重复。但我的问题是两者的混合(加上另一个困难)。
我希望我的问题不违反规则。
简短版,我需要:
长版,详细信息:
我收集的数据来自多个来源(现在为2但会变大)并且非常大(> 1000)。
我还需要将列名重新映射到一个统一的系统。在一个源上被称为“firstDay”的东西在另一个源上被称为“dateBegin”,我希望它们在我的表中被称为“startDate”。
如果我正在使用INSERT,我在构建查询时自己(在JS中)处理这个问题。但也许COPY可以更好地做到这一点。此外,INSERT似乎有一次可以推送的数据限制,因此我需要多次划分我的查询,并且可能使用回调或承诺来避免淹没数据库。
最后,我会定期自动更新这个数据库,它们会有很多重复。希望每个数据都有一个唯一的id,我在表中存储了一个存储此id的列PRIMARY KEY。我认为它可以消除重复的任何问题,但我可能是错的。
我的第一个版本非常难看(因为循环在每个循环中创建一个新查询)并且不起作用。我想在递送另一批次之前以递归方式一次做1000个数据等待回调。这样做似乎很笨重,时间也很昂贵。如果我可以选择/重命名/重新映射列并避免重复,COPY似乎是完美的。我已经阅读了文档,但我没有看到这样做的方法。
非常感谢,欢迎任何帮助。我还在学习,请善待。
答案 0 :(得分:2)
我在将临时表用于" stage"之前已经这样做了。您的数据,然后执行INSERT SELECT将数据从分段移动到生产表。
要填充临时表,您可以使用批量INSERT或COPY。
例如,
BEGIN;
CREATE TEMPORARY TABLE staging_my_table ( // your columns etc );
// Now that you have your staging table you can bulk INSERT or COPY
// into it from your code, e.g.,
INSERT INTO staging_my_table (blah, bloo, firstDay) VALUES (1,2,3), (4,5,6), etc.
// Now you can do an INSERT into your live table from your staging, e.g.,
INSERT INTO my_table (blah, bloo, startDate)
SELECT cool, bloo, firstDay
FROM staging_my_table staging
WHERE NOT EXISTS (
SELECT 1
FROM mytable
WHERE staging.bloo = mytable.bloo
);
COMMIT;
总有例外,但这可能对您有用。
有一个好的