Использовать переменную в запросе 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.