如何使用Geoalchemy2更新空间数据(如点)?

时间:2017-10-19 17:51:00

标签: python flask postgis geoalchemy2

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

我的代码如下。

Model.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)

view.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()

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

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

感谢任何答案。

1 个答案:

答案 0 :(得分:0)

emmmmmm ......

最后我自己弄清楚了。

实际上改变很简单。我只是更改了查询对象,因此它向我返回了一个可以更新的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()

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

=。=