我应该将数据库连接还是游标传递给 class

Should I pass Database connection or Cursor to a class

我正在编写一个 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 连接并将它们传递给迁移脚本。但我还从 Whosebug post 中了解到我应该只传递光标:

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

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

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

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