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

response = cur.fetchall()

print response

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

[('sample title', 'sample body', datetime.date(2012, 8, 5))]

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

processed = []

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

这感觉像是糟糕的形式,有没有人知道更好的处理方法?

4

3 回答 3

12

首先,您期望从具有“日期”数据类型的字段返回什么?明确地,date和 driver 显然在这里按预期执行。

所以你的任务实际上是找出如何说 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)

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

json.dumps(_your_dict, cls=DateEncoder)
于 2012-09-07T10:56:19.580 回答
6

正如前面的答案所暗示的,这是对日期字段进行查询的预期结果。但是,可以在查询本身中简化很多。如果您浏览 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)
于 2018-05-27T18:45:08.000 回答
0

您可以自定义 SQL 和 Python 数据类型之间的 psycopg2 映射,而不是添加编码,如下所述:

https://www.psycopg.org/docs/advanced.html#type-casting-of-sql-types-into-python-objects

代码模板是

date_oid = 1082 # id of date type, see docs how to get it from db
def casting_fn(val,cur):
  # process as you like, e.g. string formatting
# register custom mapping
datetype_casted = psycopg2.extensions.new_type((date_oid,), "date", casting_fn)
psycopg2.extensions.register_type(datetype_casted)

完成此操作后, [('sample title', 'sample body', datetime.date(2012, 8, 5))] 您将收到 [('sample title', 'sample body', '2012-08-05')]

于 2022-02-10T13:43:50.340 回答