我有一个 sqlalchemy 模型对象,它具有以下列:
gps = Column(Geometry('POINT'))
我在模型类中实现了一个 to_dict 函数,为此我需要解构 gps 对象以给我经纬度。这在另一个模型中成功地为我工作。但由于某种原因,在有问题的类中,以下代码导致属性错误('str' object has no attribute 'data'):
point = wkb.loads(bytes(self.gps.data))
我像这样存储gps数据:
gps = Point(longitude, latitude).wkt
这是来自 postgresql 的表描述:
Column | Type | Modifiers | Storage | Stats target | Description
-------------+-----------------------------+---------------------------------------------------+---------+--------------+-------------
id | integer | not null default nextval('pins_id_seq'::regclass) | plain | |
gps | geometry(Point) | | main | |
一旦 Pin 对象被创建,我就会调用 as dict 方法,如下所示:
gps = Point(
float(data['longitude']),
float(data['latitude'])
).wkt
pin = Pin(gps=gps)
# Commit pin to disk
# otherwise fields will
# not return properly
with transaction.manager:
self.dbsession.add(pin)
transaction.commit()
print (pin.as_dict())
让我发疯的是,某些代码确实适用于其他模型。任何见解将不胜感激。
编辑:在 Ilja 的评论之后,我了解到问题是对象没有被写入磁盘,显然几何列将被视为字符串,直到发生这种情况。但是即使现在我也遇到了同样的错误。基本上,在这一点上,transaction.commit() 函数没有做我认为它应该做的事情......
与此相关的是会话对象的配置。由于所有这些都在 Pyramid Web 框架下,因此我使用默认会话配置,如此处所述(您可以跳过前几段,直到他们开始讨论/models/__init__.py
文件。如果需要,请按 Ctrl + F)。
如果我遗漏了一些重要的细节,请在下面复制有问题的类:
from geoalchemy2 import Geometry
from sqlalchemy import (
Column,
Integer,
)
from shapely import wkb
from .meta import Base
class Pin(Base):
__tablename__ = 'pins'
id = Column(Integer, primary_key=True)
gps = Column(Geometry('POINT'))
def as_dict(self):
toret = {}
point = wkb.loads(bytes(self.gps.data))
lat = point.x
lon = point.y
toret['gps'] = {'lon': lon, 'lat': lat}
return toret