关于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支持范围的文档,或者我看起来不够努力?
答案 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