Как правильно сравнивать объекты SQL datetime и Python объекты datetime в запросе? - PullRequest
2 голосов
/ 18 июня 2020

Я использую Jupyter Notebooks и подключил свою базу данных Postre SQL следующим образом:

%load_ext sql
from sqlalchemy import create_engine

Я использую Python s datetime и pytz библиотеку для создания часового пояса осведомлен объект datetime:

import pandas as pd
import datetime as dt
import pytz
from pytz import timezone

eastern = timezone('EST')

now = dt.datetime.now()
start = dt.datetime(now.year, now.month, now.day - 2, now.hour, now.minute, tzinfo=eastern)

Теперь, когда я пытаюсь сделать запрос SQL, я делаю что-то вроде этого, чтобы создать pandas DataFrame:

events_query = pd.read_sql(
    """\
        SELECT start_time,
        end_time,
        FROM events 
        WHERE room_id=2 
        AND deleted=false
        AND start_time < {}
        limit 3
    """.format(start), engine)

Однако в строке start_time < {} я получаю эту ошибку:

ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "14"
LINE 10:         and start_time < 2020-06-16 14:07:00-05:00

Однако, когда я проверяю типы и значения сравнения объекта datatime SQL start_time и созданного мной Python объект datetime, сравнение работает нормально (если я опущу сравнение start_time < {}):

test = events_query['start_time'].values[0]
print(test)
print(start)
print(test > start)

Будет напечатано:

2038-11-25 12:00:00-05:00
2020-06-16 14:07:00-05:00
True

То, что я пробовал в качестве альтернативы Вместо использования обозначения .format() я также попытался использовать Python f-строки для вставки переменной start, а также использовать форматирование оператора%. Ошибка была такой же при сравнении start_time с переменной.

Извините, это моя вторая публикация на SO, дайте мне знать, правильно ли я отформатировал свой вопрос.

...