Как использовать существующую базу данных PostGIS в веб-приложении Flask - PullRequest
0 голосов
/ 04 мая 2018

Я создаю веб-приложение, используя Flask и базу данных PostGIS, которую я уже создал. Я изо всех сил пытаюсь заставить 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, похоже, он переопределяет геоалхимию2. Кто-нибудь нашел решение этой проблемы?

1 Ответ

0 голосов
/ 04 мая 2018

Не переопределяет GeoAlchemy2. Вы можете использовать GeometryColumn в качестве столбца, если вы использовали предыдущую версию GeoAlchemy .

Первая ошибка вызвана тем, что объект SQLAlchemy из Flask-SQLAlchemy предоставляет вам доступ к функциям и т. Д. Из sqlalchemy и sqlalchemy.orm. Он не включает в себя материал из GeoAlchemy2 или тому подобное.

Вторая ошибка связана с отсутствием в области действия имени GeometryColumn. Вы импортируете Geometry из geoalchemy2, но не используете его.

Читая учебник GeoAlchemy2 ORM , вы заметите, что столбцы геометрии определены как

geom = Column(Geometry('POLYGON'))

или в вашем случае

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

Обратите внимание, что db.Column - это sqlalchemy.schema.Column, просто в другом пространстве имен.

...