我为Person创建了一个仓库类,并添加了以下方法:
def find_by_order_id(self, order_id: str) -> [Person]:
results = []
client_table = Table(TBL_CLIENT, self._metadata, autoload=True,
autoload_with=self._connection)
order_table = Table(TBL_ORDER, self._metadata, autoload=True,
autoload_with=self._connection)
query = select([client_table.c.first_name, client_table.c.last_name, client_table.c.date_of_birth])
.select_from(
order_table.join(client_table, client_table.c.order_id = order_table.c.order_id)
).where(order_table.c.order_id == order_id).distinct()
for row in self._connection.execute(query).fetchall():
results.append(dict(row))
return results
由于某些我无法解释的原因,当我调试代码时,有时候SQLAlchemy会报告KeyError,但实际上该键确实存在:
File "/home/tghasemi/miniconda3/envs/myproj/lib/python3.6/site-packages/sqlalchemy/util/_collections.py", line 210, in __getattr__
return self._data[key]
KeyError: 'order_id'
我注意到这种情况只会在多线程时从连接池中获取连接断开时发生(每个线程仅使用一个连接 - 我知道连接不是线程安全的):
if use_pooling:
self._engine = create_engine(connection_string, pool_size=db_pool_size,
pool_pre_ping=db_pool_pre_ping, echo=db_echo)
else:
self._engine = create_engine(connection_string, echo=db_echo)
鉴于当异常发生时,我在异常抛出的位置打断点并检查了该键是否存在,所以我怀疑在构建查询时表的加载还未完成。
有人知道为什么会发生这样的情况吗?我放弃了!
KeyError
。 - Jamie Phan