在Python中输入变量(日期)从raw_input到postgreSQL SELECT ... WHERE

时间:2014-03-03 10:54:13

标签: python postgresql psycopg2

我不会称自己是新手,但我对编程并不十分熟悉。任何帮助,将不胜感激。我有这个项目差不多完成了。想出了很多东西,但这个问题让我感到茫然。

是否有一种简单的方法可以在postgresql查询中插入可接受的日期值:

start_date = raw_input('Start date: ')
end_date = raw_input('End date: ')

我希望上面的变量能够在下面工作。

WHERE (gltx.post_date > start_date AND gltx.post_date < end_date )

'YYYY-MM-DD'格式通过python triple quoted cursor.execute在postgresql数据库的SELECT Query中工作。

postgresql列(post.date)是日期格式。

这是python脚本的标题。

#!/usr/bin/python
import psycopg2 as dbapi2
import psycopg2.extras
import sys
import csv

现在我一直在改变不同时期的查询。

还有一种简单的方法可以将返回的日期格式化为YYYYMMDD。也许是一个用虚线替换破折号或连字符的过滤器。我也可以将它用于电话号码。

2 个答案:

答案 0 :(得分:0)

使用cursor.execute方法的参数替换

import psycopg2

query = """
    select to_char(gltx.post_date, 'YYYYMMDD') as post_date
    from gltx
    where gltx.post_date > %s AND gltx.post_date < %s
;"""

start_date = '2014-02-17'
end_date = '2014-03-04'

conn = psycopg2.connect("dbname=cpn")
cur = conn.cursor()
cur.execute(query, (start_date, end_date))
rs = cur.fetchall()
conn.close()
print rs

答案 1 :(得分:0)

如果要在Python脚本中执行此SELECT,则不应将字符串直接放入数据库查询中 - 否则会冒SQL注入的风险。请参阅psycopg2文档 - the problem with query parameters

相反,您需要使用占位符并将所有字符串参数放入一个可迭代的(通常是一个元组),它作为第二个参数传递给cursor.execute()。再次查看文档 - passing parameters to sql queries

因此,您将创建一个游标对象,并调用execute()方法,将查询字符串作为第一个参数传递,并将包含两个日期的元组作为第二个参数传递。例如

query = "SELECT to_char(gltx.post_date, 'YYYYMMDD') FROM gltx WHERE (gltx.post_date > %s AND gltx.post_date < %s)"
args = (start_date, end_date)
cursor.execute(query, args)

要在Python空间中格式化日期,可以在日期对象上使用strftime()方法。如果你想做的不仅仅是打印输出,你应该使用datetime对象而不是字符串。

您也可能想验证输入raw_input()的日期是否也是有效日期。