Django将csv文件拷贝上传到postgresql表

时间:2018-01-21 16:41:09

标签: python django postgresql csv psycopg2

我正在Django上传一个csv文件:

$('#import-file-dialog').on('change', function(event) {
  $('#upload-files').click();
});
<div class="" style="padding-left: 15px;">
  <button class="btn btn-primary btn-outline" id="open-file-dialog">Upload Bulk</button>
  <input type="file" id="import-file-dialog" name="import_file_dialog" style="display: none;" />
  <button class="btn btn-primary" id="upload-files" name="upload_import" style="display: none;">Upload Bulk</button>
</div>

现在我想使用psycopg2 copy_from将csv数据插入Posgresql。在django模型中:

fa = StringIO(import_data.read().decode("utf-8"))
cursor.copy_from(fa , table_name, sep=',')
commit_changes()

csv文件数据正在我的表中使用csv头名称进行存储。我如何删除csv头,以便我可以将该数据存储到表。

感谢您宝贵的时间。

2 个答案:

答案 0 :(得分:1)

您正在对CSV文件进行双重处理。 csv.reader逐行读取文件并将其解析为字段列表。 copy_from读取文件或其他对象并解析为字段(默认为tab,但sep=','实际上是CSV)。你可以:

a)直接阅读文件(即,只是正常打开而不是使用csv),然后使用copy_from 要么 b)使用csv.reader进行解析,然后构建查询以插入每一行。

第一种选择更简单。但请记住(来自cursor class docs)有一个可选的columns参数。如果您不使用它,则长度和类型应与要读取的文件的内容相匹配。如果未指定,则假定整个表与文件结构匹配。

不幸的是,copy_from没有“跳过标题行”选项。如果您需要这样做,您可以(如果是一次性加载)手动删除该行,或者您可以使用copy_export - 例如:

cursor.copy_expert(sql="COPY %s FROM STDIN WITH CSV HEADER DELIMITER AS ','" % table_name, file=fa)

Load a CSV File with Header in Postgres via Psycopg

的完整示例

答案 1 :(得分:1)

要跳过CSV文件标题并分别复制数据,代码非常简单:

cursor = conn.cursor()

with open(csv_file, 'r') as fp:
    next(f)  # Skip header
    cursor.copy_from(fp, table_name, sep=',', columns=columns)

P.S。不要忘记传递一个故事名称和一组有序的列,这些列应完全匹配CSV文件列的排序