【问题标题】:How can I properly annotate types using flask_sqlalchemy?如何使用 flask_sqlalchemy 正确注释类型?
【发布时间】:2020-07-08 12:15:09
【问题描述】:

我有一个使用 SQLAlchemy / flask_sqlalchemy 的工作 Flask 应用程序。为了给你一个印象,我创建了一个超级精简的版本(apps.pymodels.py)。该应用程序有效。问题是mypy 抱怨db.Modelmodels.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

models.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)

【问题讨论】:

  • 我无法重现该错误。我使用了 mypy 0.660 和 python 3.6。能否提供版本信息?谢谢!
  • @above_c_level 我也无法用最小的例子重现错误......有趣。我仍然在我的真实代码库中得到它。我尝试调整示例
  • 是整个app.py 文件吗?当错误发生时你甚至没有尝试运行它?(app.run())顺便说一句,在函数中使用应用程序不太舒服,你真的不应该这样做....尝试把dbapp作为全局变量,你可以这样做db = SQLAlchemy(app)
  • @above_c_level 我创建了一个可以看到问题的示例:github.com/MartinThoma/algorithms/tree/master/medium/…
  • 我不知道为什么它出现在这个文件夹中,而不是我上面的代码中。

标签: flask sqlalchemy flask-sqlalchemy mypy python-typing


【解决方案1】:

你需要https://pypi.org/project/sqlalchemy-stubs/

引用https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/basic_use.html

将 MyPy 与 SQLAlchemy 模型一起使用

如果您在 Python 中使用 PEP 484 静态类型检查器, type stubs for SQLAlchemy 包含一个 MyPy 插件。 该插件专为 SQLAlchemy 声明式模型量身定制。

【讨论】:

【解决方案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

【讨论】:

  • 除了在modes.py 中而不是在app.py 中定义app 之外,还有什么其他的吗?这会导致许多其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多