【问题标题】:SQLALchemy .query: Unresolved attribute reference 'query' for class 'Car'SQLALchemy .query:“汽车”类的未解析属性引用“查询”
【发布时间】:2021-04-07 07:51:57
【问题描述】:

我有一个已在此处提及的问题 https://youtrack.jetbrains.com/issue/PY-44557

但我还没有找到解决方案。我正在使用 Python Flask 和 SQLAlchemy 来创建 API 服务。

这是我的导入:

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, String, Float
import os
from flask_marshmallow import Marshmallow


app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(basedir, 'dealers.db')


db = SQLAlchemy(app)
ma = Marshmallow(app)

这是我的数据模型:

class Car(db.Model):
    __tablename__ = 'cars'
    car_id = Column(Integer, primary_key=True)
    car_name = Column(String)
    car_type = Column(String)
 

class CarSchema(ma.Schema):
    class Meta:
        fields = ('car_id', 'car_name', 'car_type')

car_schema = CarSchema()  
cars_schema = CarSchema(many=True)

当我使用 .query

时,我的 UDF 出现问题/警告
def cars():
    car_list = Car.query.all()  # *Unresolved attribute reference 'query' for class 'Car'
    result = cars_schema.dump(car_list)
    return jsonify(result)

【问题讨论】:

标签: python flask pycharm flask-sqlalchemy flask-marshmallow


【解决方案1】:

我发现了如何使用 type-hinting stubs 为这个问题制定一个 hacky 和部分解决方案。

在一个单独的文件和一个同名的“存根”文件中创建派生自db.Model的抽象python类

例子:

abstract.py:

class AbstractBaseModel(db.Model):
    __abstract__ = True

abstract.pyi:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import orm
from sqlalchemy.ext.declarative import DeclarativeMeta


db: SQLAlchemy = SQLAlchemy()


class _FBase(db.Model):
    query: orm.Query


class AbstractBaseModel(_FBase, DeclarativeMeta):
    ...

然后制作从 abstract.AbstractBaseModel 而不是 db.Model 派生的模型 例如:

from abstract import AbstractBaseModel

class Car(AbstractBaseModel):
    __tablename__ = 'cars'
    car_id = Column(Integer, primary_key=True)
    car_name = Column(String)
    car_type = Column(String)

我还创建了一个 sample project 来测试这个解决方法

【讨论】:

    【解决方案2】:

    修改class Car(db.Model):为:

    class Car(db.Model):
        __tablename__ = 'cars'
        car_id = db.Column(db.Integer, primary_key=True)
        car_name = db.Column(db.String) # it is better to give string length for example db.String(100)
        car_type = db.Column(db.String)
    

    您应该将Columns 定义为与db 相关的位置

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 2019-08-19
      • 1970-01-01
      • 2021-05-16
      • 2021-04-06
      • 2021-08-13
      相关资源
      最近更新 更多