psycopg2为date_part函数返回错误的(?)类型

时间:2012-12-20 09:08:09

标签: python django psycopg2

我有一个Django应用程序,可以使用基于django聚合查询集的Google Visualization API(Google图表)生成一些图表。 Google Charts API期望数据格式正确,以便正确生成图表(即日期必须是javascript类型Date,而不是整数或浮点数。)

假设我想为我的模型帖子创建一个聚合,以显示特定用户每年的记录总数。我的代码看起来像这样:

qset = Post.objects.filter(user__id=1).extra(select={"year": "date_part('year', cdt)"}\
          .values("year").annotate(num_records=Count("id")).order_by()

这项工作相当不错,除了用于从timestampz字段中提取年份的date_part() postgresql函数返回为float,而不是int,这样会弄乱我的图表数据。

从psql运行类似的查询会返回一个整数,这正是我所期望的。

select date_part('year', cdt) from public.core_post where id=6543;
  date_part 
  -----------
  2011
(1 row)

再一次,使用psycopg2库运行一个小python程序给我带来了同样的问题:

import psycopg2

def main():
    conn_string = "host='localhost' dbname='mydb' user='username' password='secret'"
    conn = psycopg2.connect(conn_string)
    cursor = conn.cursor()

    sql = "select date_part('year', cdt) from public.core_post where id=6543;"
    cursor.execute(sql)

    for rec in cursor.fetchone():
        print type(rec), rec

if __name__ == '__main__':
    main()

<type 'float'> 2011.0
[Finished in 0.1s]

任何人都知道为什么,或者它是否可以修复?

(我当然可以编写一个函数来解决这个问题,然后再将数据传递给我的图库,但我宁愿能够传入查询集(因为那是我写的方式)我的图表lib)。)

1 个答案:

答案 0 :(得分:2)

好的,令人尴尬。 只需重新阅读有关date_part的PostgreSQL文档,该文档清楚地说明了:

Function                    Return Type
date_part(text, interval)   double precision

我会接受这个作为答案,并留待将来参考。

通过将date_part()的结果转换为int。

来解决
qset = Post.objects.filter(user__id=1).extra(
           select={"year": "date_part('year', cdt)::int"}) \
           .values("year").annotate(num_records=Count("id")).order_by()