Использовать переменную в запросе SQL

Я хочу создать переменную now это установлено на текущее время, а затем использовать его в моих запросах psycopg2. Я пробовал использовать питона datetime так же как current_timestamp, следующим образом, но выдает ошибку и не может распознать переменную:

@app.route('/_ajax', methods=['GET', 'POST'])
def userCount():
    now = current_timestamp
    cur.execute("""SELECT count(DISTINCT(username)) from user_table WHERE tstampz >
                   (now - INTERVAL '60 mins')""")
    userCount=cur.fetchone()[0]
    return jsonify (userCount=userCount)

Если я использую datetime.datetime.now вместо current_timestamp ошибка сообщает, что datetime не может быть проиндексирован. Как правильно установить эту переменную?

Чтобы уточнить: причина, почему я не хочу использовать current_timestamp или 'now()`прямо в запросе, потому что время по умолчанию будет текущим, но в какой-то момент оно будет изменено (в зависимости от ввода пользователя), поэтому запрос будет изменен.

3 ответа

Решение

Если вы хотите сделать это в Python, вам нужен параметризованный запрос. (Проверьте детали в своей документации; вам может понадобиться что-то немного отличное от того, что я показываю.)

@app.route('/_ajax', methods=['GET', 'POST'])
def userCount():
    now = datetime.now()
    cur.execute("""SELECT count(DISTINCT(username)) from user_table WHERE tstampz >
                   (%s - INTERVAL '60 mins')""", (now,))
    userCount=cur.fetchone()[0]
    return jsonify (userCount=userCount)

Ответ, который вы приняли, показывает правильно параметризованный запрос. Однако вы должны заметить, что PostgreSQL знает, какое сейчас время, и вы рискуете запутаться в часовых поясах, используя время от клиента. Если вам действительно нужны строки за последний час, более безопасный запрос

SELECT count(DISTINCT(username)) from user_table WHERE tstampz >
               (current_timestamp - INTERVAL '60 mins')

Несколько странно, списки документации current_datetime как функцию, но вы найдете, если вы добавите скобки, чтобы вызвать его, вы получите синтаксическую ошибку.

Я думаю, что запрос должен быть:

SELECT count(DISTINCT username)
from user_table
WHERE tstampz > (now() - INTERVAL '60 mins')

Обратите внимание, что now() это функция, а не "переменная" в Postgres.

Другие вопросы по тегам