我正在由Heroku托管的nodejs(到目前为止免费计划)中工作。
我会自动从其他地方获取数据(这部分工作正常,并且我获取JSON或CVS),我的目标是将它们添加到Prostresql DB中。
虽然,我是数据库管理和Postgresql的新手,但在发布此书之前,我已经进行了研究。我知道COPY命令存在,以及如何插入多个数据而不重复。但是我的问题是两者的混合(加上另一个困难)。
我希望我的问题不会违反规则。
简短版,我需要:
带有详细信息的长版:
我收集的数据来自多个来源(目前为2个,但会越来越大),并且非常大(> 1000)。
我还需要将列名重新映射到一个统一系统。在一个源上可以称为“ firstDay”的源在另一个源上可以称为“ dateBegin”,我希望在我的表中将它们称为“ startDate”。
如果我使用的是INSERT,则在构造查询时(在JS中)我会自己照顾。但是,也许COPY可以更好地做到这一点。另外,INSERT似乎有一次可以推送的数据限制,因此我将需要多次划分查询,并可能使用回调或Promise以避免淹没数据库。
最后,我将定期自动更新此数据库,并且它们将重复很多。希望每个数据都有一个唯一的ID,并且我在存储该ID的表中做了一个PRIMARY KEY列。我以为它可以消除重复的任何问题,但我可能是错的。
我的第一个版本很丑陋(for循环使每个循环都产生一个新查询),并且没有用。我正在考虑以递归方式一次处理1000个数据,然后等待回调,然后再发送另一批数据。那样做似乎很笨重而且很费时间。如果我可以选择/重命名/重映射列并避免重复,则COPY看起来很完美。我已经阅读了文档,但没有找到一种方法。
非常感谢,欢迎您的帮助。我还在学习,所以请客气。
在使用临时表“暂存”数据然后执行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;
总是有例外,但这可能只对您有用。
祝你有个好的一天
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句