Pylint找不到SQLAlchemy查询成员

Ped*_*ira 42 python sqlalchemy pylint python-3.x flask-sqlalchemy

我有一个使用Flask-SQLAlchemy(v2.0)的Flask(v0.10.1)应用程序,我正在尝试配置Pylint来检查它.使用Python 3.4.2运行.

第一个错误是:

 Instance of 'SQLAlchemy' has no 'Table' member (no-member)
Run Code Online (Sandbox Code Playgroud)

我修复了这个,忽略了SQLAlchemy上的成员属性检查:

ignored-classes=SQLAlchemy
Run Code Online (Sandbox Code Playgroud)

但是我对实体上的查询成员有问题:

Class 'UserToken' has no 'query' member (no-member)
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题,而不必忽略每个查询调用上的无成员错误?


烧瓶引导:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
app = Flask(__name__)
db.init_app(app)
app.run()
Run Code Online (Sandbox Code Playgroud)

UserToken实体:

from app import db

class UserToken(db.Model):
    user_token_id = db.Column(db.Integer, primary_key=True, index=True)
    token_auth = db.Column(db.String(64), unique=True, nullable=False, index=True)
Run Code Online (Sandbox Code Playgroud)

控制器:

from entities import UserToken

token = UserToken.query.filter(
    UserToken.token_auth == token_hash,
).first()
Run Code Online (Sandbox Code Playgroud)

Jun*_*Jun 31

  1. pip install pylint-flask
  2. 加载已安装的插件.

    例如,如果您使用VS代码,请编辑setting.json文件,如下所示:

    "python.linting.pylintArgs": ["--load-plugins", "pylint-flask"]

可选的

如果有其他警告,请generated-memberspylintrc文件中定义剩余成员

  • 在这样做后,我仍然得到相同的错误,如'SQLAlchemy'实例没有'列'成员(没有成员)` (4认同)
  • 我必须使用 `"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy"]` (注意下划线),否则 pylint 会抛出 `ImportError: No module named 'pylint-flask-sqlalchemy' `,此外,仅添加 `pylint-flask` 不起作用,我需要按照 /sf/answers/4128591771/ 的建议使用插件 `pylint-flask-sqlalchemy` (4认同)
  • 迄今为止最新,最优雅的解决方案. (3认同)
  • 这似乎对我不起作用..也许还有其他设置需要设置 (3认同)
  • 对我来说,以下工作: `"python.linting.pylintArgs": ["--load-plugins", "pylint-flask"]` (3认同)

0rk*_*kan 17

您声明为继承的任何类在代码运行之前db.Model都不会有query成员,因此Pylint无法检测到它.

除了忽视对每一个无成员的错误造成这种情况的解决方法query调用是添加query了对generated-members在pylint的配置文件列表,因为它只会在运行时创建的成员.

运行Pylint时,它将搜索其文档中所述的配置文件:

您可以使用--rcfile选项在命令行上指定配置文件.否则,Pylint按以下顺序搜索配置文件,并使用它找到的第一个:

  1. pylintrc 在当前的工作目录中
  2. 如果当前工作目录位于Python模块中,Pylint将搜索Python模块的层次结构,直到找到pylintrc文件.这允许您逐个模块地指定编码标准.当然,如果目录包含__init__.py文件,则该目录被判断为Python模块
  3. 由环境变量命名的文件 PYLINTRC
  4. 如果你有一个不是的主目录/root:
    1. .pylintrc 在您的主目录中
    2. .config/pylintrc 在您的主目录中
  5. /etc/pylintrc

因此,如果您没有配置,并且您想要一个系统范围的pylint默认配置,您可以使用pylint --generate-rcfile > /etc/pylintrc.这将根据您可以根据您的首选项编辑的当前配置(或默认值,如果您没有)生成注释配置文件.

ps:generated-members在配置文件上是处理此警告的正确方法,正如评论配置所说的那样

  # List of members which are set dynamically and missed by pylint inference
  # system, and so shouldn't trigger E0201 when accessed. Python regular
  # expressions are accepted.
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是添加所有使用过的sql_alchemy成员是正确的处理方法吗?这既乏味又可能掩盖了不同类别的类似成员名称的进一步警告.在我看来,这不是最好的方式. (4认同)

小智 15

我在使用flask_sqlalchemy时遇到了同样的问题.我的解决方案是:

pylint --generate-rcfile>~/.config/pylintrc
Run Code Online (Sandbox Code Playgroud)

然后找到

ignored-modules
Run Code Online (Sandbox Code Playgroud)

行,重写为:

ignored-modules=flask_sqlalchemy
Run Code Online (Sandbox Code Playgroud)

所有E1101错误都消失了.

记得阅读评论:

# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
Run Code Online (Sandbox Code Playgroud)


小智 9

对我flake8有用的是切换到python linter。以下是步骤:

  1. 打开 VSCode 并运行Ctrl+shift+P(适用于 Windows 用户)
  2. 在 VSCode 搜索提示中,键入Python:Select Linter. 您将看到所有 Linter 的列表并选择 flake8。
  3. 如果你没有安装 flake8 作为 pylint 的 VScode 扩展,它会提示你安装它。继续并安装它。


np8*_*np8 9

警告:不要只是 --load-plugins pylint-flask

  • 通过这样做(使用破折号而不是下划线),您将完全禁用 pylint!这是因为--load-plugins需要导入的python 包的名称。如果你这样做,你可以在命令行上检查这个(会得到导入错误)。VS Code 中的 Pylinting 更令人讨厌,因为您不会得到任何可见的错误。相反,即使您的代码有一些 linting 问题,您的 linting 错误也将为零。

pylint-flask 不起作用

pylint-flask是一个很好的插件,但它甚至不是为了解决这个问题!您可以自己查看源代码。没有提到 Flask-SQLAlchemy;它仅用于解决 Flask 的问题(误报)。

pylint-flask-sqlalchemy

pylint的瓶-SQLAlchemy的 创建来解决与瓶-SQLAlchemy中的pylint的误报。安装后

pip install pylint-flask-sqlalchemy
Run Code Online (Sandbox Code Playgroud)

应该加上1

# NOT: "pylint-flask-sqlalchemy"
"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy"]
Run Code Online (Sandbox Code Playgroud)

1仅直接适用于VS Code。对于其他 IDE 或命令行,请按相同顺序使用相同的参数。

带有 pylint-flask-sqlalchemy 的 pylint-flask

如果一起使用,出于某种原因

"python.linting.pylintArgs": ["--load-plugins", "pylint_flask", "pylint_flask_sqlalchemy"]
Run Code Online (Sandbox Code Playgroud)

不会工作,

"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy", "pylint_flask"]
Run Code Online (Sandbox Code Playgroud)

做。因此,想必,pylint-flask 必须pylint-flask-sqlalchemy之后加载。


Mar*_*tin 8

使用 pylint 插件 pylint-flask-sqlalchemy

pip install pylint_flask_sqlalchemy
Run Code Online (Sandbox Code Playgroud)

在你的 VisualCode 的 settings.json 中

"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalcheny"]
Run Code Online (Sandbox Code Playgroud)


小智 6

这是joeforker的一个版本的答案,它在lint-time 动态地将Session对象的所有公共方法添加回一个scoped_session本地,而不是硬编码一些众所周知的方法名.

定义{path}/{to}/pylintplugins.py:

import sys

from astroid import MANAGER, scoped_nodes
from astroid.builder import AstroidBuilder
from sqlalchemy.orm import Session


def register(_linter):
    pass

def transform(cls):
    if cls.name == 'scoped_session':
        builder = AstroidBuilder(MANAGER)
        module_node = builder.module_build(sys.modules[Session.__module__])
        session_cls_node = [
            c for c in module_node.get_children()
            if getattr(c, "type", None) == "class" and c.name == Session.__name__
        ][0]

        for prop in Session.public_methods:
            cls.locals[prop] = [
                c for c in session_cls_node.get_children() 
                if getattr(c, "type", None) == "method" and c.name == prop
            ]

MANAGER.register_transform(scoped_nodes.Class, transform)
Run Code Online (Sandbox Code Playgroud)

在您的.pylintrc文件中:

load-plugins={path}.{to}.pylintplugins
Run Code Online (Sandbox Code Playgroud)


don*_*zzy 6

在尝试了许多这些选项,插件并添加了查询和所有之后。消除那些scoped_session错误的唯一解决方案是使用:

  1. pylint --generate-rcfile > pylintrc
  2. 查找忽略的类并在逗号后添加scoped_session,不留任何空格
  3. pylint再次在您的模块上运行。


小智 6

在此页面的第一个解决方案中,需要更新以下内容。这是一个错字问题,

而不是"pylint_flask"在这个settings.json参数中(在这一行中: "python.linting.pylintArgs": ["--load-plugins", "pylint_flask"])应该"python.linting.pylintArgs": ["--load-plugins", "pylint-flask"])


Ped*_*ira 0

经过大量调查后,我无法让 Pylint 理解这个成员,所以我只是添加querygenerated-members列表中,检查被忽略。

这不是一个完美的解决方案,但它确实有效。