首页 > 解决方案 > 如何使用解析列作为时间戳将 csv 上传到 QuestDb?

问题描述

我想将 csv 文件导入具有指定时间戳列的 QuestDb 表中。我必须指定其中一列不是字符串,而是我作为的时间戳

import requests
schema = '[{"name":"date", "type": "Timestamp", "pattern":"yyyy-MM-dd"}]'

with open('..\HavCases.csv', 'rb') as f:
    r = requests.post(r'http://localhost:9000/imp?name=table3&overwrite=true&timestamp=date',
        files={'schema': schema,'data': f})
    print(r.text)

但日期列不断返回为 STRING 并且响应为

not a timestamp 'date'

当我&timestamp从 URL 中删除时,我看到列被解析为 STRING,而不是时间戳

+-----------------------------------------------------------------------------------------------------------------+
|      Location:  |                                            table3  |        Pattern  | Locale  |      Errors  |
|   Partition by  |                                              NONE  |                 |         |              |
|      Timestamp  |                                              NONE  |                 |         |              |
+-----------------------------------------------------------------------------------------------------------------+
|   Rows handled  |                                               780  |                 |         |              |
|  Rows imported  |                                               780  |                 |         |              |
+-----------------------------------------------------------------------------------------------------------------+
...
|              9  |                                              date  |                   STRING  |           0  |

标签: pythonquestdb

解决方案


我找到了一个答案,必须查看 QuestDb 源代码并非易事,因此将其发布在这里供其他人使用

显然,当 QuestDb 解析导入请求时,它希望 'schema' 文件在 csv 'data' 之前是第一个。当 Python 请求从文件 字典中发布数据时,它似乎按键的字母顺序发布它,因此files={'schema': schema,'data': f}files={'data': f, 'schema': schema}是等价的,首先发送数据,然后发送模式。

为了解决这个问题,我必须提供 files 参数作为元组列表,而不是字典:

with open(r'..\HavCases.csv', 'rb') as f:
    r = requests.post(r'http://localhost:9000/imp?name=table3&overwrite=true&timestamp=date', 
    files=[('schema', schema), ('data', f)])
    print(r.text)

推荐阅读