使用 SQLAlchemy declarative_base() 在 VS Code 中“继承'Base',它不是一个类”

Posted

技术标签:

【中文标题】使用 SQLAlchemy declarative_base() 在 VS Code 中“继承\'Base\',它不是一个类”【英文标题】:"Inheriting 'Base', which is not a class" in VS Code using SQLAlchemy declarative_base()使用 SQLAlchemy declarative_base() 在 VS Code 中“继承'Base',它不是一个类” 【发布时间】:2019-12-04 07:37:47 【问题描述】:

VS 代码显示“继承'Base',它不是一个类” 给出以下错误消息:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer , String , Column

Base = declarative_base()

class Socio(Base):

    __tablename__ = 'socios'
    id = Column(Integer, autoincrement = True , primary_key = True)
    dni = Column(Integer , unique = True)
    nombre = Column(String(250))
    apellido= Column(String(250))

为什么会这样?我该如何解决?

【问题讨论】:

不要相信你的 linter(或任何其他 Python 静态分析工具)告诉你的一切:运行代码并查看它是否/如何实际上失败(然后包括您问题中的错误消息),而不是假设 VS Code 告诉您真相。 declarative_base() 确实返回了一个类。 ...也就是说:您发布的内容实际上并不是来自 Python 的错误。这是来自 VS Code 的警告。请告诉我们你从 Python 得到的实际错误,如果有的话。 (警告不会阻止代码真正运行;它只是表示 VS Code 的分析认为代码可能无法成功运行,但该分析并非来自 Python 本身,而且并不总是正确的) . 感谢您的回答。如果我在 python 终端中运行,我会收到此错误: nombre = Column(String(250)) Traceback (last recent call last): File "", line 1, in NameError: name 'Column' is未定义 您在终端中运行的内容中是否包含from sqlalchemy import Integer, String, Column 如果我在终端中运行它,我现在没有错误,但是当我尝试从其他 .py 文件导入“Socio”时,我收到此错误:“文件”/home/gastonpalav/Workspace/frro -soporte-2019-08/practico_05/ejercicio_02.py",第 6 行,在 中 from practico_05.ejercicio_01 import Base ,Socio ModuleNotFoundError: No module named 'practico_05'" 【参考方案1】:

Inheriting 'Base', which is not a class 实际上并不是一个错误。

相反,它是来自 Microsoft 的 Python 语言服务器的静态分析结果(该服务器又严重依赖 pylint)进行此类分析。它并不总是准确的:如果一个类是由函数动态生成和返回的(就像这里的情况),静态检查工具可能无法正确理解它的类型。

microsoft/python-language-server#1390 中所述,可以通过以下设置更改禁用此功能:

"python.analysis.disabled": [
    "inherit-non-class"
],

【讨论】:

谢谢。我的flask-sqlalchemy模型文件出现了这个错误,这个文件已经处理好了。我从来没有遇到过它正常运行的问题。【参考方案2】:

从 VS Code 1.47 开始,当使用 Marshmallow 序列化/反序列化 SQLAlchemy 对象并从 marshmallow_sqlalchemy.SQLAlchemyAutoSchema 继承时,使用来自 other answer 的解决方案:

"python.analysis.disabled": [
    "inherit-non-class"
],

似乎不再起作用(即,您仍然会收到“ma.SQLAlchemyAutoSchema',它不是一个类。”警告)。您可以改为在特定行上使用更通用的 #noqa 注释:

ma = Marshmallow(app)

class UserSchema(ma.SQLAlchemyAutoSchema):  # noqa
    class Meta:
        model = Person
        sqla_session = db.session

但请注意,VS Code 将 #noqa 视为该行的全部禁用设置。

【讨论】:

以上是关于使用 SQLAlchemy declarative_base() 在 VS Code 中“继承'Base',它不是一个类”的主要内容,如果未能解决你的问题,请参考以下文章

Python 学习笔记 - sqlAlchemy(初稿)

Python 学习笔记 - SQLAlchemy(下)

sqlalchemy和pymysql连接mysql的方法

定义后更改 SQLAlchemy 主键

sqlalchemy的使用

Flask使用SQLAlchemy连接mysql