下面是使用 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 中的屏幕截图:
编辑2:
在我的 VSCode 中,安装了以下 Python 相关扩展:
尝试:
customer: Customer = session.query(Customer).filter(Customer.name == "John").first()
通过这种显式类型提示,自动完成功能可能会起作用。
我知道这是一个老问题,但陷入这个问题并且不愿意使用
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(暗示一个笑话,呃呃?)以应对未来的任何重大更改。