Как правильно аннотировать типы с помощью flask_sqlalchemy?

У меня есть работающее приложение Flask, которое использует SQLAlchemy/flask_sqlalchemy. Чтобы дать вам представление, я создал супер урезанную версию (apps.py и models.py). Приложение работает. Проблема в том, что mypy жалуется на использование db.Model в models.py:

error: Name 'db.Model' is not defined

Причина, вероятно, в том, что это создается при вызове db.init_app(app). Как я могу это исправить? Есть ли лучший вариант, чем игнорировать его?

# type: ignore

app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__, template_folder="templates")
    db.init_app(app)
    return app

модели.py

from app import db

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.String, primary_key=True, nullable=False)
    username = db.Column(db.String, unique=True)

person Martin Thoma    schedule 08.07.2020    source источник
comment
Я не смог воспроизвести ошибку. Я использовал mypy 0.660 и python 3.6. Не могли бы вы предоставить информацию о версии? Спасибо!   -  person above_c_level    schedule 13.07.2020
comment
@above_c_level Я тоже не могу воспроизвести ошибку на минимальном примере ... интересно. Я все еще получаю это в своей реальной кодовой базе. Я пытаюсь настроить пример   -  person Martin Thoma    schedule 14.07.2020
comment
Это весь app.py файл? Вы даже не пытаетесь запустить его, когда возникает ошибка? (app.run()) Кстати, использование приложения в функции менее удобно, вам действительно не следует этого делать.... Попробуйте поместить db и app как глобальные переменные, чтобы вы' г быть в состоянии сделать db = SQLAlchemy(app)   -  person Patch    schedule 14.07.2020
comment
@above_c_level Я создал пример, в котором можно увидеть проблему: github.com/MartinThoma/algorithms/tree/master/medium/   -  person Martin Thoma    schedule 18.07.2020
comment
Я не уверен, почему он появляется в этой папке, а не в коде, который у меня есть выше.   -  person Martin Thoma    schedule 18.07.2020


Ответы (2)



Поскольку вы используете flask_sqlalchemy, вы пробовали это,

models.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.String, primary_key=True, nullable=False)
    username = db.Column(db.String, unique=True)

ИЗМЕНИТЬ Вот как выглядит мой app.py

from .settings import ProdConfig


def create_app(config_object=ProdConfig):
    app = Flask(__name__)
    app.config.from_object(config_object)
    register_blueprints(app)
    return app
person Rohith Samuel    schedule 13.07.2020
comment
Есть ли что-то большее, чем определение app внутри modes.py вместо app.py? Это вызывает множество других проблем. - person Martin Thoma; 14.07.2020