เคียวรีไทม์ซีรีส์จาก QuestDb โดยใช้ Pandas พร้อมพารามิเตอร์

Jan 13 2021

ฉันกำลังพยายามโหลดข้อมูลลำดับเวลาจาก QuestDb ไปยัง Pandas Dataframe ฉันกำลังพยายามใช้ไดรเวอร์ Postgres เช่น

import pandas as pd
from sqlalchemy import create_engine
from datetime import datetime

engine = create_engine('postgresql://admin:quest@localhost:8812/mydb')
df = pd.read_sql_query(
  "select * from cases where ts between %(dstart)s and %(dfinish)s",
  con=engine, 
  params={"dstart":datetime(2020,12,24,16,0),"dfinish":datetime(2021,1,1,0,0)})

แต่ได้กลับมา

DatabaseError: (psycopg2.DatabaseError) between/and parameters must be constants
LINE 1: ...etry where ts between '2020-12-24T16:00:00'::timestamp ...

ฉันยังพยายามใช้> และ <แทนระหว่าง BETWEEN

df = pd.read_sql_query(
  "select * from cases where ts > %(dstart)s and ts < %(dfinish)s",
  con=engine, 
  params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)})

แต่ยังไม่มีโชค

DatabaseError: (psycopg2.DatabaseError) unsupported class
LINE 1: ... > '2020-06-24T16:00:00'::timestamp and ts < '2021-01-0...

มันทำงานโดยไม่มีพารามิเตอร์ดังนั้นจึงไม่ผิดทั้งหมด แต่ฉันพลาดบางอย่างที่นี่

คำตอบ

4 AlexdesPelagos Jan 13 2021 at 05:40

QuestDb มีการสนับสนุนไดรเวอร์ Postgres แต่ไม่สามารถใช้งานแบบสอบถาม SQL แบบเต็มได้ ไม่กี่บิตไม่ทำงานดังนั้นระหว่างนี้จึงสามารถใช้ได้กับค่าคงที่เท่านั้น นอกจากนี้เมื่อคุณใช้พารามิเตอร์ python datetime พารามิเตอร์เหล่านี้จะถูกแปลงเป็น'2020-06-24T16:00:00'::timestampในแบบสอบถามซึ่ง QuestDb ไม่รองรับ

วิธีแก้ปัญหาคือการส่งผ่านพารามิเตอร์สตริงและแปลงเป็นการประทับเวลาในแบบสอบถามเองเช่น

df = pd.read_sql_query(
  "select * from cases where ts > to_timestamp(%(dstart)s, 'yyyy-MM-dd HH:mm:ss') " + 
  "and ts < to_timestamp(%(dfinish)s, 'yyyy-MM-dd HH:mm:ss')",
  con=engine, 
  params={"dstart":datetime(2020,12,24,16,0).strftime("%Y-%m-%d %H:%M:%S"),
  "dfinish":datetime(2021,6,24,17,0).strftime("%Y-%m-%d %H:%M:%S")})

เช่นเดียวกับในเทรนตันที่กล่าวถึงในความคิดเห็น