我应该将数据库连接或游标传递给类吗

2024-06-01 14:37:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Python脚本,将数据从生产数据库移动到开发数据库。我使用vertica-python(类似于pyodbc)进行数据库连接,使用airflow进行调度

脚本分为两个文件,一个用于DAG,另一个用于实际迁移作业。我对迁移作业中的所有SQL执行函数使用try-except-finally块:

try:
    # autocommit set to False
    # Execute a SQL script
except DatabaseError:
    # Logging information
    # Rollback
finally:
    # autocommit set to False

您可以看到设置autocommitRollback需要访问连接,执行SQL脚本需要访问游标。当前的解决方案是简单地在DAG中创建两个DB连接,并将它们传递给迁移脚本。但我也从Stackoverflow的帖子上读到,我应该只传递光标:

Python, sharing mysql connection in multiple functions - pass connection or cursor?

我的问题是:是否可以只将cursor从DAG传递到迁移脚本,并且仍然保留rollback和设置autocommit的功能


Tags: to脚本数据库falsesql作业connectioncursor
1条回答
网友
1楼 · 发布于 2024-06-01 14:37:21

是的,您可以通过光标更改autocommit设置:

>>> import pyodbc
>>> cnxn = pyodbc.connect("DSN=mssqlLocal")
>>> cnxn.autocommit
False
>>> crsr = cnxn.cursor()
>>> crsr.connection.autocommit = True
>>> cnxn.autocommit
True
>>>

pyodbc还为Cursor对象提供了commit()rollback()方法,但请注意它们会影响由同一连接创建的所有游标,即crsr.rollback()与调用cnxn.rollback()完全相同

相关问题 更多 >