psycopg2 execute返回datetime而不是字符串

Jas*_*son 2 python psycopg2

cur.execute("SELECT \
                title, \
                body, \
                date \ # This pgsql type is date
             FROM \
                table \
             WHERE id = '%s';", id)

response = cur.fetchall()

print response
Run Code Online (Sandbox Code Playgroud)

作为一个例子,这给了我: -

[('sample title', 'sample body', datetime.date(2012, 8, 5))]
Run Code Online (Sandbox Code Playgroud)

哪个不能传递给像json.dumps这样的东西所以我必须这样做: -

processed = []

for row in response:
    processed.append({'title' : row[0], 
                      'body' : row[1], 
                      'date' : str(row[2])
                     })
Run Code Online (Sandbox Code Playgroud)

感觉形状不好,有没有人知道更好的处理方式?

Ros*_*nko 10

首先,您期望从具有"日期"数据类型的字段返回什么?显然,日期和驱动程序显然在这里按预期执行.

所以你的任务实际上是找出如何说json编码器来编码datetime.date类的实例.简单的回答,通过子类化内置的改进编码器:

from datetime import date
import json

class DateEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, date):
            return str(obj)
        return json.JSONEncoder.default(self, obj)
Run Code Online (Sandbox Code Playgroud)

用法(您需要明确说明您正在使用自定义编码器):

json.dumps(_your_dict, cls=DateEncoder)
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 5

正如前面的答案所暗示的那样,这是对日期字段进行查询的预期结果。但是,可以在查询本身中进行更多的简化。如果您浏览 postgres 文档,您可以找到to_char() 函数。这将导致您的查询发生简单的变化

cur.execute("SELECT \
            title, \
            body, \
            to_char(date, 'YYY-MM-DD') \ # This pgsql type is date
         FROM \
            table \
         WHERE id = '%s';", id)
Run Code Online (Sandbox Code Playgroud)