正在加载sql/postgres中的csv列表
我有一个包含csv文件路径的表,以及一个指示文件是否已加载到数据库的布尔值。我想加载每个csv,如果成功,将文件列表中相应条目加载的布尔指示器切换为TRUE 包含名称的表格如下所示:正在加载sql/postgres中的csv列表,sql,postgresql,csv,Sql,Postgresql,Csv,我有一个包含csv文件路径的表,以及一个指示文件是否已加载到数据库的布尔值。我想加载每个csv,如果成功,将文件列表中相应条目加载的布尔指示器切换为TRUE 包含名称的表格如下所示: CREATE TABLE files ( id serial, path varchar(256), loaded bool DEFAULT FALSE, PRIMARY KEY (id) ) 只有在csv确实已加载的情况下,文件表中已加载的参数才会切换为TRUE,这一点非常重要。有一些格式错误的csv文件,我希
CREATE TABLE files
(
id serial,
path varchar(256),
loaded bool DEFAULT FALSE,
PRIMARY KEY (id)
)
只有在csv确实已加载的情况下,文件表中已加载的参数才会切换为TRUE,这一点非常重要。有一些格式错误的csv文件,我希望会抛出错误。假设您能够加载文件,并且路径包含表中加载的路径位置,则可以使用以下代码
UPDATE files
SET loaded = 'TRUE'
WHERE LENGTH(path) > 1
我将创建一个函数,使用光标,遍历文件并更新它们,如下所示: 我写psql psudocode是为了让您了解:
create or replace function load_csvs()
returns nothing
declare file_record record;
curs CURSOR
FOR SELECT id ,path
FROM files WHERE loaded = false;
begin
open cusr
loop
fetch curs into files_record;
exit when not found;
begin;
execute FORMAT('COPY tablename (<list of columns>)
FROM ''%s''
DELIMITER '',''
CSV HEADER;',files_record.path);
UPDATE files
SET loaded = true
where id = files_record.id
commit;
exception when '<whatever error>' then ROLLBACK
end;
end loop
close curs
end
说明:游标遍历文件表并获取尚未导入的文件,在游标循环中,您使用动态sql准备复制命令,每次都使用从表中获取的文件路径,如果导入成功,它会将文件表中的记录标记为已加载,如果未加载,异常捕获它并回滚更改。您可以将其更改为您想要的任何逻辑,然后转到下一个文件,直到文件中没有记录为止。如何将csv加载到数据库中?还系列是一个旧的身份栏的实现,使用新的现代生成总是一样identity@eshirvana我计划使用副本,但也期待在pg_散装。我对SQL和Postgres非常陌生,所以我不确定最好的方法是什么。我选择的任何解决方案都应该是快速的,因为我会定期加载大量数据。感谢您提供的有关串行文件过时的提示。我认为您的回答假设只有在加载了它指向的csv后,才会将路径输入到文件数据库中。实际上,路径已经在files表中。我有一个不同的程序,在前面的一点将csv路径添加到表中,现在需要加载。谢谢您的回答。我有一些后续问题:1我正在研究游标,它们似乎不是超级高效的,但有时是必要的。这是其中的一次吗?或者这可以在没有光标的情况下完成吗?2是执行格式。。。语句/将解析csv中的所有行还是不解析?3“where id=files\u record.id”之后是否缺少end语句?1这正是游标的一个用例,2如果复制命令在中间失败,您已经看到表中的一些行,您可以使用rollback而不是在异常情况下不执行任何操作参见更新的答案3可能,这是psudocode,它可能有一些语法错误。