2

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

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'

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

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

4

1 回答 1

1

它不会覆盖 GeoAlchemy2。如果您使用的是以前版本的 GeoAlchemy ,您可以将GeometryColumn其用作列。

第一个错误是由于SQLAlchemy来自 Flask-SQLAlchemy 的对象使您可以从访问函数等sqlalchemysqlalchemy.orm。它不包括来自 GeoAlchemy2 之类的东西。

第二个错误是由于范围内没有名称GeometryColumn。您确实 import Geometryfrom geoalchemy2,但不要使用它。

阅读GeoAlchemy2 ORM 教程,您会注意到几何列定义为

geom = Column(Geometry('POLYGON'))

或者在你的情况下

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

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

于 2018-05-04T09:30:28.730 回答