VSCode Intellisense for SQLAlchemy 查询结果

问题描述 投票:0回答:2

下面是使用 SQLAlchemy 查询表并读取第一条记录的代码片段:

session = Session()
customer = session.query(Customer).filter(Customer.name == "John").first()
customer.age = 50

在第 3 行代码

customer.age = 50
中,VSCode Intellisense 不起作用,可能是因为 VSCode 无法推断上一行中的
first()
方法的返回类型是什么。

有没有一种方法可以显式使用类转换或任何其他解决方法,以便类

Customer
的方法和字段在 Intellisense 中可用于其对象
customer

编辑1:

我已经声明了这样的类:

class Customer(base):
    __tablename__ = "customers"
    name = Column(String, primary_key=True, unique=True)
    age= Column(Float, nullable = False)

在 VSCode Intellisense 中,它仅显示

Customer
的 dunder 字段。它没有显示
name
age
字段。

下面是我在 VSCode 中的屏幕截图:

enter image description here

编辑2:

在我的 VSCode 中,安装了以下 Python 相关扩展:

  1. 皮兰斯
  2. Python
  3. Python 环境管理器
  4. Python 扩展包
  5. Python 缩进
python visual-studio-code sqlalchemy intellisense
2个回答
1
投票

尝试:

customer: Customer = session.query(Customer).filter(Customer.name == "John").first()

通过这种显式类型提示,自动完成功能可能会起作用。


0
投票

我知道这是一个老问题,但陷入这个问题并且不愿意使用

customer: Customer = session.query(Customer)
来保持我的导入(或代码的多个区域的重构)干净,有一种简单的方法来处理自动完成那就是调整
Base
模型。

我发现的大多数文档都提到基本设置为:

Base = declarative_base()

from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass

class Base(DeclarativeBase, MappedAsDataclass):
    pass

无论方法 #1 或方法 #2,两者都会导致 Intellisense 无法推断

.query
。我使用的是方法 #1,其中方法
declarative_base()
定义了所有内容,但生成了
Any
类型的对象,其中没有任何方法可用于类型推断。

我们需要使用方法#2,并将其用作抽象类,根据需要添加类型注释。在这种情况下,我只是添加了

query

from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, QueryPropertyDescriptor

class Base(DeclarativeBase, MappedAsDataclass):
    query: QueryPropertyDescriptor

完成此操作后,您将开始提出请求:

customer = Customer.query.filter(Cusomter.name == "John").first()

智能感知将正确识别您的类型提示。如果您需要任何额外的会话方法,只需打开 sqlalchemy/orm/session.py 并检查您可能想要定义抽象的任何其他方法。我至少也推荐摘要

commit: None
rollback: None

不确定这是否会对您有帮助,但可能会在将来对其他人有所帮助,或者将其作为Base(暗示一个笑话,呃呃?)以应对未来的任何重大更改。

© www.soinside.com 2019 - 2024. All rights reserved.