在SQL查询中使用变量

时间:2017-08-02 14:45:14

标签: python sql postgresql variables psycopg2

我想创建一个设置为当前时间的变量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()`的原因是因为时间默认到当前时间,但它将在某个时候(基于用户输入)更改,因此更改查询。

3 个答案:

答案 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 documentationcurrent_datetime列为函数,但是如果添加括号来调用它,则会发现语法错误。

答案 2 :(得分:0)

我认为查询应该是:

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

请注意,now()是Postgres中的函数而不是“变量”。