【问题标题】:Copying csv data obtained using .read() to postgresql database using Python 3.5使用 Python 3.5 将使用 .read() 获得的 csv 数据复制到 postgresql 数据库
【发布时间】:2018-07-08 01:14:46
【问题描述】:

我想复制 csv 数据而不将实际 csv 上传到我的文件夹。目前,我可以通过以下代码获取 csv 数据:

f = request.files['data_file'].read()
    a = f.decode('utf-8')

如果我要打印a,我可以从 csv 中获取数据。我的问题是如何将这些数据复制到我的 postgresql 数据库中?我尝试在 postgresql 中使用 copy 命令,但它需要文件的路径,我不想存储实际的 csv,我只想将它直接复制到我的 postgres 数据库中。我正在使用 python 3。

【问题讨论】:

  • psycopg2.copy_to

标签: python postgresql csv flask


【解决方案1】:

使用psycopg2.copy_* 方法之一是可行的方法。取决于哪一个 -

  • csv 是否有标题?
  • csv 结构是否与表完全匹配(列的数量和类型)?

注意 #1 - 采用路径的复制命令形式要求该路径存在于数据库服务器上。在 Heroku 中,情况永远不会如此。相反,您需要这样的命令形式:copy table_name from stdin...copy_from 方法是该表单的便捷方法。

1) 最简单的情况 - 逗号分隔的文件,没有与表结构完全匹配的标题:

stmt.copy_from(request.files['data_file'], 'your_table', sep=',')

stmt 是一个游标,最好在with conn.cursor() as stmt: 子句中使用)

2) 没有标题,但 csv 只有列的子集:

stmt.copy_from(request.files['data_file'], 'some_table', sep=',', cols=['col1', 'col2', 'col3'])

3) 如果你有一个标题,你需要copy_expert -

sql = """
    copy some_table (col1, col2, col3)
    from stdin with csv header delimiter ','
"""
stmt.copy_expert(sql, request.files['data_file'])

注意 #2 - 数据将被隐式转换为正确的类型。它还需要满足数据约束。单个记录的任一操作失败都会终止整个事务。因此,您可能需要花点时间将所有数据加载到一个简单的临时表中,清理它,然后执行select into (

注意#3 - 我猜你可以直接使用request.files,但没有测试它。如果失败,将数据流式传输到临时文件并将其用作复制方法的参数。

见:

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多