2014-09-27 47 views
0

关于psycopg2和范围的快速问题。考虑一个PostgreSQL表:蟒蛇插入并更新与psycopg2 tstzranges

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)) 

与主机名= socket.gethostname()IP = '127.0.0.1' 和TS是isoformat戳即

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

这样的工作,但有没有更容易/更好的方式来操纵postgresql与psycopg2除python字符串格式之外的范围?

而且在某些时候我想是这样的

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

更新表我一直没能找到有关psycopg2支持多文档与范围或也许我还没有看够硬?

回答

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,这与种过的作品,那里并没有任何无限值。

+0

感谢pozs - 完美的作品 – WraithWireless 2014-09-28 00:16:26