如何在 Flask 网络应用程序中使用现有的 PostGIS 数据库

How to use an existing PostGIS database in a Flask web app

我正在使用 Flask 和我已经创建的 PostGIS 数据库构建一个网络应用程序。我正在努力让 Flask-SQLAlchemy 接受我现有数据库的 geom 列。我在 init.py 文件中声明 db

from flask import Flask, request, current_app
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

import os, logging

db = SQLAlchemy()
migrate = Migrate()

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    db.init_app(app)
    migrate.init_app(app, db)

我的 models.py 文件代码如下所示:

from app import login, db
from datetime import datetime
from geoalchemy2 import Geometry
from time import time
from flask import current_app

class Streets(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    street = db.Column(db.String(50))
    geom = db.GeometryColumn(db.LineString(2))

我得到的错误是:AttributeError: 'SQLAlchemy' object has no attribute 'GeometryColumn'

如果我尝试从 geom 行中删除 db.,我会收到此错误:NameError: name 'GeometryColumn' is not defined

因为 Flask-SQLAlchemy 希望您使用 db.Column 声明一个列,它似乎覆盖了 geoalchemy2。有人找到解决办法了吗?

它不会覆盖 GeoAlchemy2。如果您使用的是 previous version of GeoAlchemy.

,则可以使用 GeometryColumn 作为列

第一个错误是由 Flask-SQLAlchemy gives you access to functions etc. from sqlalchemy and sqlalchemy.orm 中的 SQLAlchemy 对象引起的。它不包括来自 GeoAlchemy2 等的内容。

第二个错误是由于范围内没有名称 GeometryColumn。您从 geoalchemy2 导入 Geometry,但不要使用它。

阅读 GeoAlchemy2 ORM tutorial 您会注意到几何列被定义为

geom = Column(Geometry('POLYGON'))

或者你的情况

geom = db.Column(Geometry('LINESTRING'))  # dimension defaults to 2

请注意 db.Columnsqlalchemy.schema.Column,只是在另一个命名空间中。