【发布时间】:2018-06-26 04:49:39
【问题描述】:
我有一个具有以下列的 sqlalchemy 模型对象:
gps = Column(Geometry('POINT'))
我已经在模型类中实现了一个 to_dict 函数,为此我需要解构 gps 对象来给我 lat 和 long。这在另一个模型中成功地为我工作。但由于某种原因,在有问题的类中,以下代码导致属性错误('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 的评论,我了解到问题在于该对象没有被写入磁盘,显然 Geometry 列将被视为字符串,直到发生这种情况。但是即使现在我也遇到了同样的错误。基本上,在这一点上,transaction.commit() 函数并没有做我认为应该做的事情......
与此相关的是会话对象的配置。由于所有这些都在 Pyramid Web 框架下,因此我使用默认会话配置,如 here 所述(您可以跳过前几段,直到他们开始讨论 /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
【问题讨论】:
-
@IljaEverilä 感谢您的指点。我已根据您的建议更新了问题。
-
@IljaEverilä 我正在使用 Pyramid 框架中
request对象包含的默认会话。会话被传递给充当模型接口的类。我使用了 transaction.manager,因为刚刚运行self.dbsession.commit()返回了一个错误,说只有事务管理器可以提交。 -
@IljaEverilä 我的配置(默认 Pyramid 配置如图所示 [link] (docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/…)。它没有明确设置
expire_on_commit。我重写了该代码以将其设置为 false,但我仍然有同样的问题。有什么方法可以让我保持会话打开并让对象适当地返回属性(特别是几何)?
标签: python sqlalchemy pyramid geoalchemy2