При миграции Alembic для GeoAlchemy2 возникает ошибка NameEr: имя 'geoalchemy2' не определено

Я решил написать небольшое веб-приложение, используя Flask, postgresql и листовку. Я хотел сохранить координаты (широта и долгота), используя PostGIS extender для postgresql. Мое приложение-фляга использует Flask-SQLAlchemy, проект и особенно Flask-Migrate для процесса миграции базы данных.

Вот выдержка из моей модели базы данных:

from . import db
from geoalchemy2 import Geometry


class Station(db.Model):
    __tablename__ = 'stations'

    id = db.Column(db.Integer, primary_key=True, unique=True)
    name = db.Column(db.String(255))
    position = db.Column(Geometry('Point', srid=4326))

Вот выдержка из моего приложения /init.py

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import config

db = SQLAlchemy()
migrate = Migrate()

def create_app(config_name=None, main=True):

if config_name is None:
    config_name = os.environ.get('FLASK_CONFIG', 'development')

app = Flask(__name__)
app.config.from_object(config[config_name])

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

from .home import home as home_blueprint
app.register_blueprint(home_blueprint)

from .admin import admin as admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')

return app

Прежде чем пытаться использовать конкретный экстендер, у меня не было проблем с адаптацией моей модели. С тех пор миграция идет хорошо, но обновление не работает (python manage.py db upgrade).

Вот журнал, который я получаю с веб-сервера:

sa.Column('position', geoalchemy2.types.Geometry(geometry_type='POINT', srid=4326), nullable=True),
`enter code here`NameError: name 'geoalchemy2' is not defined

Я немного растерялся, и я не нашел большой помощи по этому конкретному вопросу. Любая идея о том, что может вызвать эту проблему?

2 ответа

Решение

Alembic не пытается определить и выполнить все операции импорта для пользовательских типов в сценариях миграции. Отредактируйте сгенерированный скрипт для включения from geoalchemy2.types import Geometry и измените столбец def просто использовать Geometry,

Вы должны всегда проверять автоматически сгенерированные скрипты перед их выполнением. В сценарии даже есть комментарии, говорящие об этом.

Другой способ сделать это, не требующий ручного редактирования ревизии, — добавить import geoalchemy2в alembic/script.py.makoа затем алембик каждый раз добавляет модуль.

      """${message}
  
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}

"""
from alembic import op
import sqlalchemy as sa
import geoalchemy2 # <--- right here
${imports if imports else ""}

# revision identifiers, used by Alembic.
revision = ${repr(up_revision)}
down_revision = ${repr(down_revision)}
branch_labels = ${repr(branch_labels)}
depends_on = ${repr(depends_on)}


def upgrade():
    ${upgrades if upgrades else "pass"}


def downgrade():
    ${downgrades if downgrades else "pass"}
Другие вопросы по тегам