'PyCharm warns about unexpected arguments for SQLAlchemy User model

I'm working with Flask-SQLAlchemy in PyCharm. When I try to create instances of my User model by passing keyword arguments to the model, PyCharm highlights the arguments with an "Unexpected argument(s)" warning. When I create instances of other models, I don't get this warning. Why am I getting this error for my User model?

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, unique=True, nullable=False)

new_user = User(username="test")

In the above example username="test" is highlighted as a warning.

warning in PyCharm



Solution 1:[1]

This is a bug in PyCharm, not your code. PyCharm doesn't recognize column names as arguments when using mixins. You can show your interest in the issue by clicking the thumbs up button next to its title. Until then, there's nothing you can do to fix the issue besides disabling the inspection or ignoring the highlighting.

Solution 2:[2]

If you would like to solve without a lot of effort, you can use type hints on more recent versions of python.

When defining your class, simply place the type hint directly into the declaration:

class User(db.Model, UserMixin):
    id: db.Column = db.Column(db.Integer, primary_key=True)
    username: db.Column = db.Column(db.String, unique=True, nullable=False)

If you do this for all tables, it does turn out a bit verbose, but it will also be fully functional for all linters, not just PyCharm.

Solution 3:[3]

Another way to solve this annoying issue is to add a comment # type: ignore to the line, which removes Pycharm's type checking on that line and looks a lot nicer:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, unique=True, nullable=False)

new_user = User(username="test")  # type: ignore

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 davidism
Solution 2 slightlynybbled
Solution 3 NotSoShabby