Запросить таймсерии из QuestDb с использованием Pandas с параметрами
Я пытаюсь загрузить данные таймсерий из 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...
Он работает без параметров, так что это не совсем неправильно, но мне что-то здесь не хватает.
Ответы
QuestDb поддерживает драйверы Postgres, но не полностью совместим с SQL-запросами. Некоторые биты не работают, поэтому BETWEEN, по-видимому, можно использовать только с константами. Также, когда вы используете параметры 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")})
Это то же самое, что и в упомянутом в комментариях Трентоне.