使用范围运算符查询PostgreSQL时出错

时间:2015-02-15 15:58:50

标签: postgresql python-2.7 psycopg2

我正在尝试使用tstzrange查询postgresql(v 9.3.6)表,以确定定义为

的表中是否存在给定的时间戳
CREATE TABLE sensor(
  id serial,
  hostname varchar(64) NOT NULL,
  ip varchar(15) NOT NULL,
  period tstzrange NOT NULL,
  PRIMARY KEY(id),
  EXCLUDE USING gist (hostname WITH =, period with &&)
); 

我正在使用psycopg2,当我尝试查询时:

sql = "SELECT id FROM sensor WHERE %s <@ period;"
cursor.execute(sql,(isotimestamp,))

我收到错误

psycopg2.DataError: malformed range literal: 
...
DETAIL:  Missing left parenthesis or bracket.

我尝试过各种类型的铸件无济于事。

我使用以下查询管理了一种解决方法:

sql = "SELECT * FROM sensor WHERE %s BETWEEN lower(period) AND upper(period);"

但想知道为什么我对范围运算符有问题。是我的代码还是psycopg2还是什么?

感谢任何帮助。

编辑1: 为了回应这些评论,我在postgresql中的一个简单的1行表中尝试了相同的查询,如下所示

=> select * from sensor;
session_id | hostname |    ip     |                              period                               
------------+----------+-----------+-------------------------------------------------------------------
1 | bob    | 127.0.0.1 | ["2015-02-08 19:26:42.032637+00","2015-02-08 19:27:28.562341+00")

(1行)

现在使用&#34; @&gt;&#34;运算符我收到以下错误:

=> select * from sensor where period @> '2015-02-08 19:26:43.04+00';
ERROR:  malformed range literal: "2015-02-08 19:26:43.04+00"
LINE 1: select * from sensor where period @> '2015-02-08 19:26:42.03...

这似乎与psycopg2错误相同,错误的范围字面值,所以我想我会尝试类型转换为时间戳,如下所示

=> select * from sensor where sensor.period @> '2015-02-08  19:26:42.032637+00'::timestamptz;
session_id | hostname |    ip     |                              period                               

------------ + ---------- + ----------- + ----------- -------------------------------------------------- ------     1 |野蛮| 127.0.0.1 | [&#34; 2015-02-08 19:26:42.032637 + 00&#34;,&#34; 2015-02-08 19:27:28.562341 + 00&#34;)

所以看来这是我的错误,字面必须是类型转换或者假设它是一个范围。使用psycopg2,可以使用以下命令执行查询:

sql="select * from sensor where period @> %s::timestamptz"    

0 个答案:

没有答案