python插入并使用psycopg2更新tstzranges

时间:2014-09-27 15:50:59

标签: python postgresql psycopg2

关于psycopg2和范围的快速提问。考虑一个postgresql表:

CREATE TABLE sensor(
  hostname varchar(64) NOT NULL, -- hostname of sensor
  ip varchar(15) NOT NULL,       -- ip of sensor
  period tstzrange NOT NULL,     -- valid range of sensor
  EXCLUDE USING gist (hostname WITH =, period with &&)
);

以下插入的工作原理

sql = "insert into sensor values (%s,%s,%s);"
curs.execute(sql,(hostname,ip,'[%s,infinity]' % ts))

hostname = socket.gethostname()ip ='127.0.0.1',ts是isoformat时间戳,即

dt.datetime.utcfromtimestamp(time.time()).isoformat()+"z"

这有效,但是有一种更容易/更好的方法来使用psycopg2而不是python字符串格式来操作postgresql中的范围吗?

另外在某些时候我想用这样的东西更新表

sql = "update sensor set period.upper = %s where hostname = %s and period.upper = infinity;"

我无法找到关于psycopg2支持范围的文档,或者我看起来不够努力?

2 个答案:

答案 0 :(得分:2)

您可以使用range constructor创建范围从较低和较低的范围。上限:

SELECT rangetype(lower, upper [, bounds]);
-- bounds can be '()', '(]', '[)' (default), or '[]'

对于更新,您可以使用lower()& upper() range functions

sql = "insert into sensor values (%s, %s, tstzrange(%s, NULL));"
curs.execute(sql, (hostname, ip, ts))

sql = "update sensor set period = tstzrange(lower(period), %s) where hostname = %s and upper_inf(period);"

注意:我使用unbounded ranges,它也适用于类型,其中没有任何无穷大值。

答案 1 :(得分:0)

是的,有更好的方法,你没有足够的搜索:http://initd.org/psycopg/docs/extras.html#range-data-types