I have a Flask (v0.10.1) application using Flask-SQLAlchemy (v2.0) and I'm trying to configure Pylint to check it. Running with Python 3.4.2.

First error was:

 Instance of 'SQLAlchemy' has no 'Table' member (no-member)

And I fixed this one ignoring the check for member attributes on SQLAlchemy:

ignored-classes=SQLAlchemy

But I'm having a problem with the query member on entities:

Class 'UserToken' has no 'query' member (no-member)

Is there any way to fix this issue without having to ignore no-member errors on every query call?


Flask bootstrap:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
app = Flask(__name__)
db.init_app(app)
app.run()

UserToken entity:

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)

The controller:

from entities import UserToken

token = UserToken.query.filter(
    UserToken.token_auth == token_hash,
).first()

Solution 1:

Solution

pip install pylint-flask

pip install pylint-flask-sqlalchemy

Load the installed plugin.

For example, if you use VS code, please edit settings.json file as follows:

"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy", "pylint_flask"]

Optional

If having other warnings, define remaining members in generated-members in pylintrc file.

Solution 2:

Any class you declare as inheriting from db.Model won't have query member until the code runs so Pylint can't detect it.

The workaround for this besides ignoring no-member errors on every query call is to add query on the generated-members list in a Pylint config file since it is a member that will only be created at runtime.

When you run Pylint, it will search for a configuration file as stated in its documentation:

You can specify a configuration file on the command line using the --rcfile option. Otherwise, Pylint searches for a configuration file in the following order and uses the first one it finds:

  1. pylintrc in the current working directory
  2. If the current working directory is in a Python module, Pylint searches up the hierarchy of Python modules until it finds a pylintrc file. This allows you to specify coding standards on a module-by-module basis. Of course, a directory is judged to be a Python module if it contains an __init__.py file
  3. The file named by environment variable PYLINTRC
  4. if you have a home directory which isn’t /root:
    1. .pylintrc in your home directory
    2. .config/pylintrc in your home directory
  5. /etc/pylintrc

So if you don't have a config and you want a system wide default config for pylint you can use pylint --generate-rcfile > /etc/pylintrc. This will generate a commented configuration file according to the current configuration (or the default if you don't have one) that you can edit to your preferences.

p.s.: generated-members on a config file is the right way to deal with this warning, as it's said by the commented config

  # 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.

Solution 3:

I meet the same issue when using flask_sqlalchemy. my solution is:

pylint --generate-rcfile>~/.config/pylintrc

and then find the

ignored-modules

line, rewrite it to:

ignored-modules=flask_sqlalchemy

all E1101 errors are gone.

Remeber to read the comment:

# 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.

Solution 4:

Warning: Do not just --load-plugins pylint-flask

  • By doing this (using dashes instead of underscores) you will just disable pylint altogether! This is because the --load-plugins needs the name of the python package to be imported. You can check this on command line (will get ImportError) if you do so. Pylinting in VS Code is nastier since you will not get any visible errors. Instead, you will have zero linting errors even if your code would have some linting problems.

pylint-flask will not work

pylint-flask is a good plugin, but it is not even meant to tackle this problem! You can see the source code for yourself. There is no mentions about Flask-SQLAlchemy; it is only designed to fix issues (false positives) with Flask.

pylint-flask-sqlalchemy

The pylint-flask-sqlalchemy was created to fix the pylint false positives with Flask-SQLAlchemy. After installing with

pip install pylint-flask-sqlalchemy

one should add it with1

# NOT: "pylint-flask-sqlalchemy"
"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy"]

1Applies directly only for VS Code. With other IDEs or command line, use the same arguments in the same order.

pylint-flask with pylint-flask-sqlalchemy

If used together, for some reason

"python.linting.pylintArgs": ["--load-plugins", "pylint_flask", "pylint_flask_sqlalchemy"]

will not work but

"python.linting.pylintArgs": ["--load-plugins", "pylint_flask_sqlalchemy", "pylint_flask"]

does. So, presumably, the pylint-flask must be loaded after pylint-flask-sqlalchemy.