【问题标题】:Django upload csv file copy to postgresql tableDjango 将 csv 文件副本上传到 postgresql 表
【发布时间】:2018-01-21 16:41:08
【问题描述】:

我正在 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 标头以便我可以将该数据存储到表中。

感谢您宝贵的时间。

【问题讨论】:

    标签: python django postgresql csv psycopg2


    【解决方案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 文件列的顺序完全匹配

    【讨论】:

      【解决方案2】:

      您正在对 CSV 文件进行双重处理。 csv.reader 逐行读取文件并将其解析为字段列表。 copy_from 读取文件或其他对象并解析为字段(默认为选项卡,但使用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 上的完整示例

      【讨论】:

      • 感谢您的回复。我根据您的建议更新了问题,但无法删除 csv 文件的标题。
      • 让我试试,会告诉你的,再次感谢你的回答。
      猜你喜欢
      • 1970-01-01
      • 2021-02-02
      • 2021-09-23
      • 2022-11-10
      • 2021-12-23
      • 1970-01-01
      • 2020-11-04
      • 2020-11-14
      • 2017-01-11
      相关资源
      最近更新 更多