【问题标题】:python insert and update tstzranges with psycopg2python 使用 psycopg2 插入和更新 tstzranges
【发布时间】:2014-12-05 20:44:54
【问题描述】:

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

with hostname = socket.gethostname() ip='127.0.0.1' 并且 ts 是一个 isoformat 时间戳,即

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

这可行,但是除了 python 字符串格式之外,有没有更简单/更好的方法来使用 psycopg2 在 postgresql 中操作范围?

另外,在某些时候我想用类似的东西更新表格

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

我找不到太多关于 psycopg2 支持范围的文档,或者我可能还不够努力?

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    您可以使用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,它也适用于没有任何 infinity 值的类型。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-05
        • 2015-06-10
        • 2017-09-17
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        相关资源
        最近更新 更多