Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在加载sql/postgres中的csv列表_Sql_Postgresql_Csv - Fatal编程技术网

正在加载sql/postgres中的csv列表

正在加载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文件,我希

我有一个包含csv文件路径的表,以及一个指示文件是否已加载到数据库的布尔值。我想加载每个csv,如果成功,将文件列表中相应条目加载的布尔指示器切换为TRUE

包含名称的表格如下所示:

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,它可能有一些语法错误。