Psycopg2 - запрос последних 24 часов к базе данных postgreSQL cur.execute - PullRequest
0 голосов
/ 03 мая 2019

Я испытываю затруднения при запросе всех данных из таблицы в течение последних 24 часов, и трудно сказать, является ли это ошибкой postgres на моей части python, так как я новичок

Я вижу поле "ключ к публикации", возвращает значение datetime.datetime.

# print out columns names
cur.execute(
    """
    SELECT *
    FROM "table"
    LIMIT 1
    """
)

# print out columns names
colnames = [desc[0] for desc in cur.description]
print(colnames)

# print out col values
rows = cur.fetchall()
print(rows)

['id', 'publishedAt', ......]
[['5a086f56-d080-40c0-b6fc-ee78b08aec3d', datetime.datetime(2018, 11, 11, 
15, 39, 58, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), .....]

Однако

cur.execute(
    """
    SELECT * 
    FROM "table"
    WHERE publishedAt BETWEEN %s and %s;""", 
    (dt.datetime.now() - dt.timedelta(days=1))
)    

приводит к:

TypeError: 'datetime.datetime' object does not support indexing

возможно ли использовать библиотеку datetime в запросах psycopg2

1 Ответ

2 голосов
/ 04 мая 2019

вы хотите передать кортеж в cur.execute(), вы передаете одно значение (которое отличается от «кортежа», содержащего одно значение)

также, почему бы не сделать дату / времячто-то в Postgres, он неплохо справляется с этим.например, ваш запрос может быть что-то вроде:

cur.execute("""SELECT * FROM "table" WHERE publishedAt > now() - interval '1 day'""")

, иначе вы можете выполнить вычисления даты в базе данных с помощью:

cur.execute("""SELECT * FROM "table" WHERE publishedAt > %s - interval '1 day'""", (dt.datetime.now(),))

(обратите внимание на дополнительную запятую в конце) или сделатьвычисление в Python с:

cur.execute("""SELECT * FROM "table" WHERE publishedAt > %s""", (dt.datetime.now() - dt.timedelta(days=1),))

, если вы хотите установить верхний предел дат, вы, вероятно, захотите сделать что-то вроде:

now =  dt.datetime.now()
cur.execute("""SELECT * FROM "table" WHERE publishedAt BETWEEN %s AND %s""", (now - dt.timedelta(days=1), now))

(обратите внимание, что Python знает, что скобки указываюткортеж, поэтому запятая не нужна)

...