2 votes

backend spatialite pour geoalchemy2 en Python

J'essaie d'utiliser SQLITE/spatialite avec geoalchemy2 . Il semble être possible selon que lien .

Mon problème vient je pense du moteur personnalisé.

Ce que j'ai jusqu'à présent :

from flask_sqlalchemy import SQLAlchemy
from geoalchemy2 import Geometry
#and other imports...

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////Users/cricket/Documents/peas project/open-peas/localapp/test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True

db = SQLAlchemy(app)

class Polygon(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    point = db.Column(Geometry("POLYGON"))

@app.before_first_request
def init_request():
    db.create_all()

Lorsque je lance le script, j'obtiens le message ci-dessous :

cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "POLYGON": syntax error [SQL: '\nCREATE TABLE polygon (\n\tid INTEGER NOT NULL, \n\tname VARCHAR(64), \n\tpoint geometry(POLYGON,-1), \n\tPRIMARY KEY (id), \n\tUNIQUE (name)\n)\n\n'] (Background on this error at: http://sqlalche.me/e/e3q8)

Une idée de la façon dont je pourrais réparer cela ?

4voto

Tom Brown Points 12

J'ai eu le même problème et il a fallu du temps pour le résoudre. Il y a un tas de couches (SQLAlchemy, Flask, SQLite, spatialite, l'extension SQLAlchemy de Flask, ....) qui travaillent ensemble. J'espère que cela vous aidera :

from sqlalchemy import event

db = SQLAlchemy(app)

@event.listens_for(db.engine, "connect")
def load_spatialite(dbapi_conn, connection_record):
  # From https://geoalchemy-2.readthedocs.io/en/latest/spatialite_tutorial.html
  dbapi_conn.enable_load_extension(True)
  dbapi_conn.load_extension('/usr/lib/x86_64-linux-gnu/mod_spatialite.so')

1voto

mamouthautapis Points 111

En me débattant avec la même question, même avec la réponse acceptée, j'ai fini par réaliser que le management argument de la Geometry() était manquant, comme expliqué aquí .

Le contenu suivant devrait envoyer la bonne commande sql à DB API :

class Polygon(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    point = db.Column(Geometry("POLYGON", management = True))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X