我想创建一个设置为当前时间的变量now
,然后在我的psycopg2查询中使用它。我尝试使用python的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()`的原因是因为时间默认到当前时间,但它将在某个时候(基于用户输入)更改,因此更改查询。
答案 0 :(得分:2)
如果要在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)
答案 1 :(得分:1)
您接受的答案显示了正确参数化的查询。但是,您应该注意PostgreSQL知道当前时间是什么,并且您通过使用客户端的时间来冒时区混淆的风险。如果您确实需要过去一小时的行,则更安全的查询
SELECT count(DISTINCT(username)) from user_table WHERE tstampz >
(current_timestamp - INTERVAL '60 mins')
奇怪的是,the documentation将current_datetime
列为函数,但是如果添加括号来调用它,则会发现语法错误。
答案 2 :(得分:0)
我认为查询应该是:
SELECT count(DISTINCT username)
from user_table
WHERE tstampz > (now() - INTERVAL '60 mins')
请注意,now()
是Postgres中的函数而不是“变量”。