psycopg2 - 如何始终将非字符串值转换为字符串

2 投票
2 回答
5158 浏览
提问于 2025-04-17 08:31

psycopg2的文档里有说明,怎么把一种特定的数据类型转换成另一种类型:

Psycopg会把数据库里的小数/数字类型转换成Python的Decimal对象。那我能不能用float类型呢?
你可以为PostgreSQL的小数类型注册一个自定义的适配器:

    DEC2FLOAT = psycopg2.extensions.new_type(
        psycopg2.extensions.DECIMAL.values,
        'DEC2FLOAT',
        lambda value, curs: float(value) if value is not None else None)
    psycopg2.extensions.register_type(DEC2FLOAT)

但是我的数据会有字符串、浮点数、整数、小数、日期等多种类型。我该怎么告诉psycopg2把任何非字符串的值都转换成字符串呢?我不想每次遇到新类型的时候都注册一个自定义适配器,因为我的查询可能会变化。
我希望我把情况说明得够清楚。谢谢!

2 个回答

0

也许可以直接调用 str(object),或者获取对象的字符串表示方法,比如 object.__str__

4

你可以删除所有的类型转换器,然后以Postgres字符串的形式接收所有内容:

import psycopg2

for k in psycopg2.extensions.string_types.keys():
    del psycopg2.extensions.string_types[k]

cnn = psycopg2.connect('')
cur = cnn.cursor()
cur.execute("select 1::int, now()::timestamp, 'hello'::text")
cur.fetchone()
('1', '2011-12-19 16:50:11.396855', 'hello')

撰写回答