Python “未解析属性”;栏「;“课堂上”;“炼金术”;

Python “未解析属性”;栏「;“课堂上”;“炼金术”;,python,pycharm,flask-sqlalchemy,Python,Pycharm,Flask Sqlalchemy,我使用pycharm 5.0和python3.5,并通过pycharm的内置功能(设置项目解释器-“+”)下载了所有的liarbry。其他库看起来不错,但Alchemy出现了一些问题 我成功导入了flask SQLAlchemy。但是,pycharm提醒我“类'SQLAlchemy'中的未解析属性引用'Column'”,“类'SQLAlchemy'中的未解析属性引用'relationship'等等 我尝试了一些方法,但都不起作用。例如:1.重新启动2.删除并重新下载3.刷新缓存。在 代码: 从f

我使用pycharm 5.0和python3.5,并通过pycharm的内置功能(设置项目解释器-“+”)下载了所有的liarbry。其他库看起来不错,但Alchemy出现了一些问题

我成功导入了flask SQLAlchemy。但是,pycharm提醒我“类'SQLAlchemy'中的未解析属性引用'Column'”,“类'SQLAlchemy'中的未解析属性引用'relationship'等等

我尝试了一些方法,但都不起作用。例如:1.重新启动2.删除并重新下载3.刷新缓存。在

代码:

从flask导入flask、重定向、呈现模板、会话、url、flash
从flask_sqlalchemy导入sqlalchemy
从flask_引导导入引导
来自WASKU wtf进口表格
从wtforms导入StringField、SubmitField
导入操作系统
从wtforms.validators导入所需数据
basedir=os.path.abspath(os.path.dirname(_文件__))
app=烧瓶(名称)
app.config['SECRET_KEY']=“难以猜测字符串”
app.config['SQLALCHEMY\u DATABASE\u URI']=\
'sqlite://'+os.path.join(basedir'data.sqlite')
app.config['SQLALCHEMY\u COMMIT\u ON\u TEARDOWN']=True
引导=引导(应用程序)
db=SQLAlchemy(应用程序)
类角色(db.Model):
__tablename_uu='角色'
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(64),unique=True)
users=db.relationship('User',backref='role',lazy='dynamic')
定义报告(自我):
返回“%self.name”
类用户(db.Model):
__tablename_uu='users'
id=db.Column(db.Integer,主键=True)
username=db.Column(db.String(64),unique=True,index=True)
role\u id=db.Column(db.Integer,db.ForeignKey('roles.id'))
定义报告(自我):
返回“%self.username”

如何解决此问题?

flask\u sqlalchemy.sqlalchemy类调用的构造函数,它将
sqlalchemy
sqlalchemy.orm
中的所有属性附加到其实例

这仅在运行时完成,PyCharm的代码检查无法检测到

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

我不是Python或SQLAlchemy专家,也不会判断这是否是一个好的设计,但您可以在这里提出一个问题并进行讨论。

以下是我的工作

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()

发布代码,返回的错误使我困惑……我发现属性“Column”的位置在G:\python\Lib\site packages\sqlalchemy\sql\schema.py中,但类“sqlalchemy”在G:\python\Lib\site packages\flask\u sqlalchemy\u init\upy中,我在类“sqlalchemy”的源代码中没有找到任何属性。您的代码运行吗?这是最重要的。我查看了flask_sqlalchemy的源代码,它似乎使用了一些魔法来与PyCharm可能无法正确检测的基本sqlalchemy库兼容。它可以运行。但我想知道python如何处理这个问题,即扩展库和源库之间的关系,他们是怎么联系的?我不确定这是否是最佳做法,但它确实减少了一点麻烦,谢谢。
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()