我正在编写一个Python脚本来将数据从生产数据库移动到开发数据库。我使用vertica-python (类似于pyodbc)进行数据库连接,使用airflow进行调度。
该脚本分为两个文件,一个用于DAG,另一个用于实际迁移作业。对于迁移作业中的所有try-except-finally执行函数,我都使用SQL块:
try:
# autocommit set to False
# Execute a SQL script
except DatabaseError:
# Logging information
# Rollback
finally:
# autocommit set to False您可以看到,设置autocommit和Rollback需要访问连接,执行SQL脚本需要访问游标。当前的解决方案是在DAG中简单地创建两个DB连接,并将它们传递给迁移脚本。但我也从Stackoverflow帖子中读到,我应该只传递光标:
Python, sharing mysql connection in multiple functions - pass connection or cursor?
我的问题是:是否可以仅将cursor从DAG传递到迁移脚本,而仍然保留rollback和设置autocommit的能力
发布于 2021-01-25 22:23:19
可以,您可以通过光标更改autocommit设置:
>>> import pyodbc
>>> cnxn = pyodbc.connect("DSN=mssqlLocal")
>>> cnxn.autocommit
False
>>> crsr = cnxn.cursor()
>>> crsr.connection.autocommit = True
>>> cnxn.autocommit
True
>>>pyodbc还在游标对象上提供了commit()和rollback()方法,但请注意,它们会影响由同一连接创建的所有游标,即crsr.rollback()与调用cnxn.rollback()完全相同。
https://stackoverflow.com/questions/65886146
复制相似问题