SQLAlchemy:禁用在异常堆栈跟踪内打印查询

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

我正在使用

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
有一个神奇的开关?
如果没有,我只是无法理解,人们如何记录此类异常和/或将它们保存到日志服务器以供以后使用......

python-3.x postgresql sqlalchemy
1个回答
0
投票
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

属性。

    

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