“SQLAlchemy”类中未解析的属性“Column”

Posted

技术标签:

【中文标题】“SQLAlchemy”类中未解析的属性“Column”【英文标题】:unresolved attribute "Column" in class "SQLAlchemy" 【发布时间】:2021-09-21 17:11:58 【问题描述】:

我使用pycharm 5.0和python3.5。我通过pycharm的内置函数(设置-项目-项目解释器-“+”)下载了所有的库。其他库看起来很好,但是烧瓶出现了一些问题-SQLAlchemy。

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

我尝试了一些方法,但它们没有奏效。例如:1.restart 2.remove and redownload 3.refresh the cache.which in PyCharm shows unresolved references error for valid code

代码:

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

我该如何解决这个问题?

【问题讨论】:

发布代码,返回错误 sth 让我很困惑......我发现属性 "Column" 的位置在 G:\python\Lib\site-packages\sqlalchemy\sql\schema.py 中,但是'SQLAlchemy' 类在 G:\python\Lib\site-packages\flask_sqlalchemy_init_.py 中,我在 'SQLAlchemy' 类的源代码中没有找到任何属性。跨度> 你的代码运行了吗?这才是最重要的。我查看了 flask_sqlalchemy 的源代码,看起来它使用了一些魔法来与 PyCharm 可能无法正确检测到的基本 sqlalchemy 库兼容。 它可以运行。但是我想知道python是如何处理这个的,即extension lib和origin lib之间的关系,它们是如何连接的 你找到答案了吗? 【参考方案1】:

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

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

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

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

【讨论】:

根据维护者的this comment 看来,它们似乎不会很快添加。【参考方案2】:

这就是我的工作。

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

【讨论】:

我不确定这是否是最佳做法,但它肯定会减少一些烦恼,谢谢。【参考方案3】:

在你的 pycharm 或环境中检查 flask_sqlalchemy 的版本。 我有同样的问题,最简单的解决方案

pip install flask_sqlalchemy --upgrade 

100% 完成了。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于“SQLAlchemy”类中未解析的属性“Column”的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy - SQLite 中未创建 SQLalchemy 外键

类中未定义的函数或变量

使用 Flask-SQLAlchemy 在 Alembic 自动生成迁移中未检测到任何变化

SQLAlchemy

TF2.0:翻译模型:恢复保存的模型时出错:检查点(根)中未解析的对象.optimizer.iter:属性

使用 Restkit 解析数组中未命名的 JSON 数组