如何在Peewee中处理PostgreSQL的point几何类型?
处理PostgreSQL point类型的peewee模型问题
pwiz自动生成的模型会将PostgreSQL的point列识别为UnknownField,导致无法正常读写,解决方法如下:
1. 自定义PointField字段类
实现一个适配PostgreSQL point类型的peewee字段,处理数据库与Python对象的转换:
from peewee import Field class PointField(Field): db_field = 'point' def db_value(self, value): if value is None: return None # 将Python tuple转换为PostgreSQL point格式字符串 return f'({value[0]}, {value[1]})' def python_value(self, value): if value is None: return None # 将数据库返回的point字符串解析为tuple coords = value.strip('()').split(',') return (float(coords[0].strip()), float(coords[1].strip()))
如果使用psycopg2,还可以注册适配器让tuple直接适配point类型(可选):
from psycopg2.extensions import register_adapter, AsIs def adapt_point(point): return AsIs(f'POINT({point[0]} {point[1]})') register_adapter(tuple, adapt_point)
2. 替换模型中的UnknownField
把生成代码里的UnknownField()替换为自定义的PointField:
# 原代码 # column_name = UnknownField() # point # 修改后 column_name = PointField(null=True) # 根据实际表结构设置null属性
3. 验证读写功能
- 读取数据时,该字段会返回
(x坐标, y坐标)格式的tuple - 写入数据时,直接传入tuple(如
(10.5, 20.3))即可自动转换为point类型存入数据库
内容的提问来源于stack exchange,提问作者Mr. Clear
相关产品推荐
相关产品推荐

