代码之家  ›  专栏  ›  技术社区  ›  Laurent R

Python中geoalchemy2的spatialite后端

  •  1
  • Laurent R  · 技术社区  · 7 年前

    我正在尝试使用SQLITE/spatialite geoalchemy2 . 根据这一点看来是有可能的 link .

    我想我的问题来自定制引擎。

    到目前为止我所拥有的:

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

    当我启动脚本时,我得到以下信息:

    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)
    

    你知道我该怎么解决吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   David42 Tom Brown    6 年前

    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')
    
        2
  •  1
  •   mamouthautapis    5 年前

    在同一个问题上苦苦挣扎,即使有了公认的答案,我最终意识到 management Geometry() 如前所述,构造函数丢失 here .

    以下内容应向DB API发送正确的sql命令:

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