我正在尝试将类型提示引入现有代码库,但是当我尝试键入查询时遇到了问题。
from sqlalchemy.orm.query import Query
class DbContext:
def __init__(self, db_host, db_port, db_name, db_user, db_password):
engine = create_engine(...)
session = sessionmaker(bind=engine)
self.Session: Session = session(bind=engine)
...
def fetch(context: DbContext, filters: ...):
sub_query: Query = context.Session.query(...)
在我添加类型提示之前,动态过滤只是一个简单的问题:
if filters.name is not None:
sub_query = sub_query.filter(
Person.name.ilike(f"%{filters.name}%"))
但是,现在提示我收到此错误:
“无”类型的表达式不能分配给声明的类型“查询”
果然,filter
似乎返回None
:
(方法)过滤器:(*标准:未知)-> 无
我导航到源,看来该方法确实没有返回任何内容。
def filter(self, *criterion):
for criterion in list(criterion):
criterion = expression._expression_literal_as_text(criterion)
criterion = self._adapt_clause(criterion, True, True)
if self._criterion is not None:
self._criterion = self._criterion & criterion
else:
self._criterion = criterion
显然某处存在断开连接,因为分配None
到sub_query
应该会导致提示警告的错误,但我需要执行分配以使过滤真正起作用:
# Does NOT work, filtering is not applied
if filters.name is not None:
sub_query.filter(
Person.name.ilike(f"%{filters.name}%"))
# Works but Pylance complains
if filters.name is not None:
sub_query = sub_query.filter(
Person.name.ilike(f"%{filters.name}%"))
这是我第一次涉足 Python,希望得到一些关于这里发生了什么的指导!