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

时间:2018-05-04 09:11:04

标签: python flask sqlalchemy flask-sqlalchemy geoalchemy2

我正在使用Flask和我已经创建的PostGIS数据库构建一个Web应用程序。我很难让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。有没有人找到解决方案?

1 个答案:

答案 0 :(得分:0)

它不会覆盖GeoAlchemy2。如果您使用previous version of GeoAlchemy,则可以使用GeometryColumn作为列。

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

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

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

geom = Column(Geometry('POLYGON'))

或在你的情况下

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

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