我正在使用 Flask-SQLAlchemy(版本 2.5.1)和 Python 3.11 连接到 PostgreSQL 15 数据库。
如果表存在,我想使用 DROP TABLE IF EXISTS ... CASCADE 删除该表。这是我的代码:
from sqlalchemy import text
from sqlalchemy.exc import SQLAlchemyError
try:
sql = text("DROP TABLE IF EXISTS {table_name} CASCADE")
db.session.execute(sql)
db.session.commit()
except Exception as e:
logger.error(f"Failed to drop {table_name} table: {str(e)}")
except SQLAlchemyError as e:
db.session.rollback()
logger.error(f"An error occurred: {str(e)}")
但是,当表不存在时,我没有看到 Python 中引发任何异常,即使 PostgreSQL 日志显示以下内容:
LOG: statement: DROP TABLE IF EXISTS devices CASCADE
NOTICE: table "devices" does not exist, skipping
LOG: statement: COMMIT
由于该表不存在,PostgreSQL 会记录一个通知,但我的 Python 代码中不会传播任何异常。
我的问题是:
- 当表不存在时,传递“原始”SQL 语句是否会引发异常?
- 有没有办法将数据库的状态消息绑定到我的 Python 代码,以便我可以更明确地处理这种情况?
execute()
我是否应该在和commit()
命令之后手动检查数据库的错误代码?