2017-10-19 10 views
0

Je viens d'écrire un petit site web pour montrer quelques données spatiales en utilisant flask et Geoalchemy2. Maintenant, je peux insérer de nouveaux enregistrements spatiaux (par exemple, des points) dans ma base de données postgresql mais j'ai des problèmes quand je veux les mettre à jour.Comment utiliser Geoalchemy2 pour mettre à jour des données spatiales (comme un point)?

mon code est comme ci-dessous.

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 initialisation:

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

Mon code fonctionne quand j'ajoute un nouveau record de points.

Lorsque je modifie le point existait mon code d'une partie de mise à jour renvoie le résultat imprimé (je veux juste savoir comment l'écrire.):

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

qui ne ressemble pas à une classe, mais un tuple si Je ne peux pas le mettre à jour avec

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

Dans le official document il n'y a que des exemples pour ajouter de nouveaux objets dans la base de données, donc je suis vraiment confus.

Existe-t-il une phrase MAGIC pour mettre à jour les données ou existe-t-il d'autres bibliothèques de géographie à utiliser?

Appréciation pour toute réponse.

Répondre

0

emmmmmm ......

Enfin, je me débrouille tout seul.

En fait, le changement est très simple. Je change juste l'objet de requête pour qu'il me renvoie un objet Geopoint qui peut être mis à jour.

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

changement à cette.

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

Ensuite, mon code de mise à jour est possible d'écrire.

=. =