类"SQLAlchemy"中未解析的属性"Column"

dog*_*ang 7 python pycharm flask-sqlalchemy

我使用pycharm 5.0和python3.5.我通过pycharm的内置函数(setting-project-project interpreter - "+")下载所有的liarbry.其他库看起来很好,但是一些问题发生在flask-SQLAlchemy上.

我成功导入了flask-SQLAlchemy.但是,pycharm提醒我"类'SQLAlchemy'中的"未解析的属性引用'Column'."在类'SQLAlchemy'中未解析的属性引用'关系'"等等.

我尝试了一些方法,但它们没有用.例如:1.restart 2.remove and redownload 3.refresh cache.which在PyCharm中提到显示有效代码的未解析引用错误

码:

from flask import Flask, redirect, render_template, session, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_wtf import Form
from wtforms import StringField, SubmitField
import os
from wtforms.validators import data_required


basedir = os.path.abspath(os.path.dirname(__file__))


app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] =\
    'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True


bootstrap = Bootstrap(app)

db = SQLAlchemy(app)


class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role', lazy='dynamic')

    def __repr__(self):
        return '<Role %r>' % self.name


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return '<User %r>' % self.username
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Mic*_*ael 13

在的构造函数flask_sqlalchemy.SQLAlchemy调用类_include_sqlalchemy,其中附加的所有属性sqlalchemysqlalchemy.orm它的实例。

这仅在运行时完成,不会被 PyCharm 的代码检查检测到。

它需要flask_sqlalchemy使用更标准的方式来导入这些属性,例如from sqlalchemy import *. 但这会将属性导入flask_sqlalchemy模块而不是每个实例,SQLAlchemy从而改变访问它们的方式。

我不是 Python 或 SQLAlchemy 专家,不会判断这是否是好的设计,但您可以在https://github.com/mitsuhiko/flask-sqlalchemy上打开一个问题并在那里讨论。


Car*_*ard 9

这就是我所做的。

from flask_sqlalchemy import SQLAlchemy
from typing import Callable


class MySQLAlchemy(SQLAlchemy):  # Or you can add the below code on the SQLAlchemy directly if you think to modify the package code is acceptable.
    Column: Callable  # Use the typing to tell the IDE what the type is.
    String: Callable
    Integer: Callable


db = MySQLAlchemy(app)


class User(db.Model, UserMixin):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))  # The message will not show: Unresolved attribute reference 'Column' for class 'SQLAlchemy' 

    def __init__(self, *args, **kwargs): 
        super().__init__(*args, **kwargs)


def create_test_data():
    db.create_all()
    test_user = User(name='Frank')  # I add __init__, so it will not show you ``Unexpected argument``
    db.session.add(test_user)
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)