我应该将数据库连接还是游标传递给 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
可以看到设置autocommit
和Rollback
需要访问连接,执行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= 完全相同].
我正在编写一个 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
可以看到设置autocommit
和Rollback
需要访问连接,执行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= 完全相同].