python - SELECT 语句遇到错误后需要提交(或回滚)
问题描述
SELECT
当遇到语句错误时,显然TRANSACTION保持打开状态。
与 psycopg 建立联系:
# ...
connection.autocommit = False
cur = connection.cursor(cursor_factory=DictCursor)
选择不存在的表:
cur.execute('SELECT * FROM "non_exists_table"') # a incorrect query
psycopg2.errors.UndefinedTable: relation "non_exists_table" does not exist
然后执行另一个查询:
cur.execute('SELECT * FROM "exists_table"') # this is a correct query
psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block
为什么?
是否为所有人psycopg2
打开交易execute()
?甚至SELECT
?!!
是否可以避免在选择查询中启动TRANSACTION ?
解决方案
来自@snakecharmerb的坦克征求意见
通过这个参考:
默认情况下,第一次将命令发送到数据库(使用连接创建的游标之一)时,会创建一个新事务。
如果任何命令失败,事务将被中止并且在调用 rollback() 方法之前不会执行进一步的命令。
解决方案1:
connection.autocommit = True
解决方案2:
with psycopg2.connect(DSN) as conn:
with conn.cursor() as curs:
curs.execute(SQL)
如果块没有引发异常,则提交事务。如果出现异常,事务将回滚。
与文件对象或其他资源不同,退出连接的 with 块不会关闭连接,而只会关闭与其关联的事务。
推荐阅读
- python - 烧瓶 sqlalchemy。提交不保存更改
- angular - Angular (2+) - 在数据绑定插值中得到延迟
- ios-autolayout - “NSLayoutYAxisAnchor”类型的值没有成员“约束”
- typo3 - Fallback og:image if no images are present in an ext:news story
- php - 如何在3个相关表之间创建条件
- ios - Apple Pay 钱包屏幕 (PKAddPaymentPassViewController) 在我的应用程序中无法正常显示
- salesforce-lightning - 在开发人员控制台中打开使用 Lightning App Builder 构建的应用程序
- amazon-web-services - CloudFormation 命令列表 cwd
- c# - 具有列为空的条件的 Linq 查询记录
- android - 扩展 BroadcastReceiver onReceive 函数无法从其他类获取静态 ArrayList