如何从CSV文件复制到CSV文件中的标题的PostgreSQL表?

我想复制CSV文件到Postgres表。 这张桌子里有大约100列,所以我不想重写,如果我不需要。

我正在使用\copy table from 'table.csv' delimiter ',' csv; 命令但没有创build表我得到ERROR: relation "table" does not exist 。 如果我添加一个空白表,我没有得到任何错误,但没有任何反应。 我尝试了这个命令两三次,没有输出或消息,但是当我通过PGAdmin检查它时表没有被更新。

有没有一种方法来导入一个表头像我想要做的?

这工作。 第一行有列名。

 COPY wheat FROM 'wheat_crop_data.csv' DELIMITER ';' CSV HEADER 

使用Python库pandas ,您可以轻松创build列名并从csv文件推断数据types。

 from sqlalchemy import create_engine import pandas as pd engine = create_engine('postgresql://user:pass@localhost/db_name') df = pd.read_csv('/path/to/csv_file') df.to_sql('pandas_db', engine) 

if_exists参数可以设置为replace或附加到现有的表,例如df.to_sql('pandas_db', engine, if_exists='replace') 。 这也适用于其他input文件types,文档在这里和这里 。

terminal没有权限的替代

NOTES的pg文档说

path将被解释为相对于服务器进程的工作目录(通常是集群的数据目录),而不是客户端的工作目录。

所以,通常,使用psql或任何客户端,即使在本地服务器,你也有问题…而且,如果你要为其他用户expressionCOPY命令,例如。 在Github自述文件中,读者将遇到问题…

用客户端权限表示相对path的唯一方法是使用STDIN

当指定STDIN或STDOUT时,通过客户端和服务器之间的连接传输数据。

正如这里所记得的那样 :

 psql -h remotehost -d remote_mydb -U myuser -c \ "copy mytable (column1, column2) from STDIN with delimiter as ','" \ < ./relative_path/file.csv 

我一直在使用这个function,没有任何问题。 您只需要提供csv文件中的编号列,它将从第一行获取标题名称并为您创build表格:

 create or replace function data.load_csv_file ( target_table text, -- name of the table that will be created csv_file_path text, col_count integer ) returns void as $$ declare iter integer; -- dummy integer to iterate columns with col text; -- to keep column names in each iteration col_first text; -- first column name, eg, top left corner on a csv file or spreadsheet begin set schema 'data'; create table temp_table (); -- add just enough number of columns for iter in 1..col_count loop execute format ('alter table temp_table add column col_%s text;', iter); end loop; -- copy the data from csv file execute format ('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_file_path); iter := 1; col_first := (select col_1 from temp_table limit 1); -- update the column names based on the first row which has the column names for col in execute format ('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first) loop execute format ('alter table temp_table rename column col_%s to %s', iter, col); iter := iter + 1; end loop; -- delete the columns row // using quote_ident or %I does not work here!? execute format ('delete from temp_table where %s = %L', col_first, col_first); -- change the temp table name to the name given as parameter, if not blank if length (target_table) > 0 then execute format ('alter table temp_table rename to %I', target_table); end if; end; $$ language plpgsql;