Django 上传 csv 文件复制到 postgresql table
Django upload csv file copy to postgresql table
我正在用 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 header 名称存储在我的 table 中。我如何删除 csv header 以便我可以将该数据存储到 table.
感谢您抽出宝贵时间。
您正在对 CSV 文件进行双重处理。 csv.reader
逐行读取文件并将其解析为字段列表。 copy_from
读取文件或其他对象并解析为字段(默认为制表符,但 sep=','
它实际上是 CSV)。您可以:
a) 直接读取文件(即正常打开它而不是使用 csv
)然后使用 copy_from
要么
b) 使用 csv.reader 解析然后构建查询以插入每一行。
第一个选项要简单得多。但请记住(来自 cursor class docs)有一个可选的 columns
参数。如果您不使用它,那么 长度和类型应该与要读取的文件的内容相匹配。如果不指定,则假定整个table匹配文件结构
很遗憾,copy_from
没有 "skip the header line" 选项。如果您需要这样做,您可以(如果是一次性加载)手动删除该行,或者您可以使用 copy_export
- 类似于:
cursor.copy_expert(sql="COPY %s FROM STDIN WITH CSV HEADER DELIMITER AS ','" % table_name, file=fa)
跳过你的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 文件的列顺序完全匹配
我正在用 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 header 名称存储在我的 table 中。我如何删除 csv header 以便我可以将该数据存储到 table.
感谢您抽出宝贵时间。
您正在对 CSV 文件进行双重处理。 csv.reader
逐行读取文件并将其解析为字段列表。 copy_from
读取文件或其他对象并解析为字段(默认为制表符,但 sep=','
它实际上是 CSV)。您可以:
a) 直接读取文件(即正常打开它而不是使用 csv
)然后使用 copy_from
要么
b) 使用 csv.reader 解析然后构建查询以插入每一行。
第一个选项要简单得多。但请记住(来自 cursor class docs)有一个可选的 columns
参数。如果您不使用它,那么 长度和类型应该与要读取的文件的内容相匹配。如果不指定,则假定整个table匹配文件结构
很遗憾,copy_from
没有 "skip the header line" 选项。如果您需要这样做,您可以(如果是一次性加载)手动删除该行,或者您可以使用 copy_export
- 类似于:
cursor.copy_expert(sql="COPY %s FROM STDIN WITH CSV HEADER DELIMITER AS ','" % table_name, file=fa)
跳过你的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 文件的列顺序完全匹配