如何使用flask_sqlalchemy正确注释类型?

如何使用flask_sqlalchemy正确注释类型?,flask,sqlalchemy,flask-sqlalchemy,mypy,python-typing,Flask,Sqlalchemy,Flask Sqlalchemy,Mypy,Python Typing,我有一个工作烧瓶应用程序,它使用SQLAlchemy/Flask\u SQLAlchemy。为了给您留下印象,我创建了一个超级精简版(apps.py和models.py)。该应用程序运行良好。问题是mypy抱怨models.py中使用了db.Model: error: Name 'db.Model' is not defined 原因很可能是在调用db.init\u app(app)时创建的。我怎样才能解决这个问题?还有比忽略它更好的选择吗 # type: ignore app.py mod

我有一个工作烧瓶应用程序,它使用SQLAlchemy/
Flask\u SQLAlchemy
。为了给您留下印象,我创建了一个超级精简版(
apps.py
models.py
)。该应用程序运行良好。问题是
mypy
抱怨
models.py
中使用了
db.Model

error: Name 'db.Model' is not defined
原因很可能是在调用
db.init\u app(app)
时创建的。我怎样才能解决这个问题?还有比忽略它更好的选择吗

# type: ignore
app.py models.py
既然你在使用炼金术,你试过这个吗

models.py

编辑 这就是我的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
你需要

引自

将MyPy与SQLAlchemy模型一起使用

如果您正在为Python使用PEP 484静态类型检查器, 随附MyPy插件。 该插件是针对SQLAlchemy声明性模型定制的


我无法再现这个错误。我使用了mypy0.660和python3.6。你能提供版本信息吗?谢谢@高于c_水平,我也不能用最小的例子重现错误。。。有趣。我仍然在我真正的代码库中得到它。我尝试调整示例它是整个
app.py
文件吗?当错误发生时,您甚至没有尝试运行它?(
app.run()
)顺便说一句,在函数中使用app不太舒服,您真的不应该这样做。。。。尝试将
db
app
作为全局变量,这样您就可以执行
db=SQLAlchemy(app)
@在c_级别以上我创建了一个示例,可以看到这个问题:我不知道为什么它出现在这个文件夹中,而不是出现在我上面的代码中。除了在
modes.py
中定义
app
而不是在
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)
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)
from .settings import ProdConfig


def create_app(config_object=ProdConfig):
    app = Flask(__name__)
    app.config.from_object(config_object)
    register_blueprints(app)
    return app