0

我只是写了一个小网站来展示一些使用烧瓶和 Geoalchemy2 的空间数据。现在我可以在我的 postgresql 数据库中插入一些新的空间记录(例如,点),但是当我想更新它们时遇到了一些麻烦。

我的代码如下。

模型.py:

class Geopoint(db.Model):
"""point class"""
    __tablename__ = 'geo_point'
    ptid = db.Column(db.Integer, primary_key=True)
    quiztime = db.Column(db.Numeric)
    geopt = db.Column(Geography(geometry_type='POINT', srid=4326))

初始化.py:

db = SQLAlchemy()
geo_engine = create_engine('postgresql://postgres:password@localhost/database', echo=True)

视图.py:

geo_session_class = sessionmaker(bind=geo_engine)
geo_session = geo_session_class()

if request.method == 'POST':
    if geo_type == 'POINT':
        pt_res = geo_session.query(
            Geopoint.ptid,
            Geopoint.quiztime,
            Geopoint.geopt.ST_AsText()
        ).filter_by(ptid=geo_id).first()
        if pt_res:
            print pt_res
        else:
            geo_session.add(
                Geopoint(
                    quiztime=time.time(),
                    geopt=geo_type + '(' + geo_coord.encode('utf-8') + ')'
                )
            )
            geo_session.commit()

当我添加新的点记录时,我的代码有效。

当我编辑存在点时,我的更新部分代码返回打印结果(我只想知道如何编写它。):

(4L, Decimal('1508430387.581'), u'POINT(120.057, 30.262)')

这看起来不像是一个类,而是一个元组,所以我不能用它来更新它

Geopoint.geopt=.....
db.session.add(Geopoint)
db.session.commit()

官方文档中只有将新对象添加到数据库中的示例,所以我真的很困惑。

是否有任何 MAGIC 语句来更新数据,或者是否有任何其他地理 orm 库可供使用?

感谢任何答案。

4

1 回答 1

0

emmmmmm……</p>

最后我自己弄清楚了。

其实改变很简单。我只是更改了查询对象,以便它向我返回一个可以更新的 Geopoint 对象。

geo_session_class = sessionmaker(bind=geo_engine) geo_session = geo_session_class()

if request.method == 'POST':
    if geo_type == 'POINT':
        pt_res = geo_session.query(
            Geopoint.ptid,
            Geopoint.quiztime,
            Geopoint.geopt.ST_AsText()
        ).filter_by(ptid=geo_id).first()
        if pt_res:
            print pt_res
        else:
            geo_session.add(
                Geopoint(
                    quiztime=time.time(),
                    geopt=geo_type + '(' + geo_coord.encode('utf-8') + ')'
                )
            )
            geo_session.commit()

改成这个。

if request.method == 'POST':
    if geo_type == 'POINT':
        pt_res = geo_session.query(Geopoint).filter_by(ptid=geo_id).first()
        if pt_res:
            print pt_res
        else:
            geo_session.add(
                Geopoint(
                    quiztime=time.time(),
                    geopt=geo_type + '(' + geo_coord.encode('utf-8') + ')'
                )
            )
            geo_session.commit()

然后我的更新代码就可以写了。

=。=

于 2017-10-21T08:36:02.377 回答