1

我正在使用 Psychopg2 模块从 Python 对 QuestDB 进行查询。我在使用copy_from()游标对象将 CSV 数据放入表中时遇到了一些麻烦。将其放入数据库的最佳方法是什么?

我正在尝试以下操作:

import pandas as pd
import numpy as np
import psycopg2
import os

conn = psycopg2.connect(user="admin",
                              password="quest",
                              host="127.0.0.1",
                              port="8812",
                              database="qdb")

cursor = conn.cursor()

dest_table = "eur_fr_bulk"
temp_dataframe = "./temp_dataframe.csv"

# input
df = pd.read_csv("./data/eur_fr.csv")
df.to_csv(temp_dataframe, index_label='id', header=False)

f = open(temp_dataframe, 'r')

cursor = conn.cursor()
try:
    cursor.copy_from(f, dest_table)
    conn.commit()
except (Exception, psycopg2.DatabaseError) as error:
    os.remove(temp_dataframe)
    print("Error: %s" % error)
    conn.rollback()
    cursor.close()

cursor.close()
4

1 回答 1

2

Psychopg2 中的copy_from()包装器正在后台执行一些 QuestDB 尚不支持的 SQL,具体来说,它将运行

COPY my_table FROM stdin WITH DELIMITER AS '    ' NULL AS '\\N'

DELIMITER关键字尚未实现。作为一种解决方法,您可以在 python 中通过 HTTP 发出请求,这可能是最方便的:

import requests

csv = {'data': ('my_table_import', open('./data/eur_fr.csv', 'r'))}
server = 'http://localhost:9000/imp'

response = requests.post(server, files=csv)
print(response.text)

或者您可以在server.conf文件中指定允许加载 CSV 文件的复制目录。这记录在COPY 文档页面上

于 2021-02-24T15:03:57.577 回答