Psycopg 3类型适配器详解:从基础类型到复杂JSON处理
【免费下载链接】psycopgNew generation PostgreSQL database adapter for the Python programming language项目地址: https://gitcode.com/gh_mirrors/ps/psycopg
Psycopg 3作为Python语言的新一代PostgreSQL数据库适配器,提供了强大的类型转换功能,能够无缝连接Python与PostgreSQL数据类型。本文将详细介绍Psycopg 3的类型适配器系统,从基础类型映射到复杂JSON处理,帮助开发者轻松实现数据交互。
基础类型适配器:无缝对接Python与PostgreSQL
数值类型适配
Psycopg 3对数值类型提供了全面支持,Python的int、float和Decimal类型可自动转换为PostgreSQL的对应类型。默认情况下,Pythonint会根据数值大小适配为PostgreSQL的integer或bigint,而Decimal则对应numeric类型。
如需将PostgreSQLnumeric类型转换为Pythonfloat,可通过注册自定义加载器实现:
conn.adapters.register_loader("numeric", psycopg.types.numeric.FloatLoader)日期时间类型处理
日期时间类型的适配是数据库交互中的常见需求。Psycopg 3支持Pythondatetime模块与PostgreSQL日期时间类型的双向转换:
- Python
date↔ PostgreSQLdate - Python
datetime↔ PostgreSQLtimestamp/timestamptz - Python
time↔ PostgreSQLtime - Python
timedelta↔ PostgreSQLinterval
时区感知的datetime对象会自动适配为PostgreSQL的timestamptz类型,确保时间信息的准确传递。
UUID类型支持
Pythonuuid.UUID对象与PostgreSQLUUID类型的转换非常简单,Psycopg 3提供了原生支持:
from uuid import uuid4 conn.execute("INSERT INTO users (id) VALUES (%s)", [uuid4()])数组与枚举类型:高级数据结构适配
数组类型处理
PostgreSQL的数组类型可直接与Pythonlist相互转换。Psycopg 3会自动处理一维数组的适配,对于多维数组也提供了良好支持:
# Python list → PostgreSQL array conn.execute("INSERT INTO scores VALUES (%s)", [[90, 85, 95]]) # PostgreSQL array → Python list scores = conn.execute("SELECT scores FROM students WHERE id=1").fetchone()[0]枚举类型映射
Psycopg 3支持Pythonenum.Enum与PostgreSQL枚举类型的双向映射。使用register_enum()函数可实现完整的类型转换:
from psycopg.types.enum import EnumInfo, register_enum from enum import Enum class Status(Enum): ACTIVE = "active" INACTIVE = "inactive" # 获取PostgreSQL枚举信息并注册 enum_info = EnumInfo.fetch(conn, "status_enum") register_enum(enum_info, Status) # 现在可以直接使用枚举成员 conn.execute("INSERT INTO users (status) VALUES (%s)", [Status.ACTIVE])JSON类型处理:灵活高效的数据交换
JSON与JSONB支持
Psycopg 3提供了Json和Jsonb包装器,用于Python对象与PostgreSQL JSON/JSONB类型的转换。默认使用标准库json模块进行序列化和反序列化:
from psycopg.types.json import Jsonb data = {"name": "Alice", "age": 30, "hobbies": ["reading", "hiking"]} conn.execute("INSERT INTO profiles VALUES (%s)", [Jsonb(data)])自定义JSON序列化
通过set_json_dumps()和set_json_loads()函数,可自定义JSON的序列化和反序列化过程,支持如ujson、msgspec等高效库:
from psycopg.types.json import set_json_dumps, set_json_loads import ujson # 全局设置 set_json_dumps(ujson.dumps) # 连接级别设置 set_json_loads(partial(json.loads, parse_float=Decimal), conn)对于特殊对象(如UUID),可通过自定义编码器实现序列化:
class UUIDEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, UUID): return str(obj) return json.JSONEncoder.default(self, obj) uuid_dumps = partial(json.dumps, cls=UUIDEncoder) obj = {"uuid": uuid4()} conn.execute("INSERT INTO objs VALUES %s", [Json(obj, dumps=uuid_dumps)])自定义类型适配器:扩展适配能力
适配器注册机制
Psycopg 3的适配器系统基于上下文管理,允许在不同级别注册自定义适配器:
- 全局级别:修改
psycopg.adapters影响所有连接 - 连接级别:通过
conn.adapters影响单个连接 - 游标级别:通过
cur.adapters影响单个游标
注册自定义加载器和转储器的基本方法:
# 注册加载器(PostgreSQL → Python) conn.adapters.register_loader("xml", XmlLoader) # 注册转储器(Python → PostgreSQL) conn.adapters.register_dumper(ET.Element, XmlDumper)适配器继承与隔离
适配器上下文支持继承机制,子上下文会继承父上下文的适配器配置。这使得可以创建隔离的适配器环境,满足不同场景的需求:
# 创建新的适配器上下文 new_context = psycopg.adapters.copy() new_context.register_loader("numeric", FloatLoader) # 使用新上下文创建连接 conn = psycopg.connect(conninfo, context=new_context)实战应用:优化类型适配性能
选择合适的适配器策略
在处理大量数据时,选择合适的类型适配器策略可以显著提升性能:
- 对于数值类型,考虑使用
float替代Decimal以提高处理速度 - 对于JSON数据,使用
ujson或msgspec替代标准json模块 - 对于大型数组,考虑使用
numpy类型以优化内存使用
常见问题解决方案
- 时区处理:始终使用时区感知的
datetime对象,避免时区转换错误 - 大数值处理:对于超大整数,考虑使用
Numeric类型避免精度丢失 - 复杂对象序列化:通过自定义适配器简化复杂对象的数据库存储
总结:掌握Psycopg类型适配器
Psycopg 3的类型适配器系统为Python与PostgreSQL之间的数据交互提供了强大支持,从基础类型到复杂JSON结构,都能实现无缝转换。通过灵活使用内置适配器和自定义扩展,开发者可以构建高效、可靠的数据库应用。
要深入了解Psycopg 3类型适配器的更多细节,请参考官方文档:
- 适配器基础:docs/basic/adapt.rst
- 类型系统API:docs/api/types.rst
- JSON处理:docs/api/types.rst
【免费下载链接】psycopgNew generation PostgreSQL database adapter for the Python programming language项目地址: https://gitcode.com/gh_mirrors/ps/psycopg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考