2017-10-19 105 views
0

我只寫了一個小網站,使用燒瓶和Geoalchemy2來顯示一些空間數據。現在我可以在postgresql數據庫中插入一些新的空間記錄(例如,點),但當我想更新它們時會遇到一些麻煩。如何使用Geoalchemy2更新空間數據(如點)?

我的代碼如下。

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:[email protected]/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庫可供使用?

讚賞任何答案。

回答

0

emmmmmm ......

最後我自己弄清楚了。

其實這個改變很簡單。我只是改變查詢對象,所以它返回一個Geopoint對象給我,可以更新。

geo_session_class = sessionmaker(綁定= 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() 

然後我的更新代碼是可以寫的。

=。=