我正在使用
insert
语句,它可以批量插入大量记录。一路上发生了一些异常,但我看不到它的完整堆栈跟踪,因为查询非常长并且它堵塞了整个控制台PyCharm
。声明很简单:
async with session() as s:
statement = (
insert(chat)
.values(chats)
.on_conflict_do_nothing(
index_elements=[chat.slug]
)
)
await s.execute(statement)
await s.commit()
查询将是参数化的,因此它包含很多此类代码:
$82289::CHAR(5), $82290::VARCHAR(255)), ($82291::VARCHAR(100), $82292::CHAR(5), $82293::VARCHAR(255)), ($82294::VARCHAR(100), $82295::CHAR(5), $82296::VARCHAR(255)), ($82297::VARCHAR(100), $82298::CHAR(5), $82299::VARCHAR(255)), ($82300::VARCHAR(100), $82301::CHAR(5), $82302::VARCHAR(255)), ($82303::VARCHAR(100), $82304::CHAR(5), $82305::VARCHAR(255)), ($82306::VARCHAR(100), $82307::CHAR(5), $82308::VARCHAR(255)), ($82309::VARCHAR(100), $82310::CHAR(5), $82311::VARCHAR(255)), ($82312::VARCHAR(100), $82313::CHAR(5), $82314::VARCHAR(255)), ($82315::VARCHAR(100), $82316::CHAR(5), $82317::VARCHAR(255)), ($82318::VARCHAR(100), ...
有没有办法摆脱将查询的“整个”打印到控制台的情况?也许我的sessionmaker
或
create_engine
有一个神奇的开关?如果没有,我只是无法理解,人们如何记录此类异常和/或将它们保存到日志服务器以供以后使用......
sqlalchemy.exc
异常对象都有一个包含查询的属性
.statement
。您可以将其设置为空字符串并引发异常。在你的情况下,它看起来像这样:async with session() as s:
statement = (
insert(chat)
.values(chats)
.on_conflict_do_nothing(
index_elements=[chat.slug]
)
)
try:
await s.execute(statement)
except Exception as err:
err.statement = ""
raise
await s.commit()
因此,您将得到错误和回溯,并且不会有庞大的查询。如果您也不希望回溯,那么您可以使用仅包含错误的
.args
属性。