https://docs.python.org/3/library/contextlib.html
в случае, когда у вас есть скоуп для применения ресурса, оч классно использовать контекстные менеджеры
объявляется декоратором @contextmanager, дальше при помощи with используется
вы наверняка встречали, когда работали с файлами:
with open('workfile') as f: позволяет вам провести все операции с файлом — он закроется автоматически при выходе из скоупа
пример кейса — коннекшн к бд, открываем его, в нем открываем курсор (контекстный менеджер в контекстном менеджере), в скоупе делаем что-то и конекшн закроется при выходе автоматом, и дальше его можно переиспользовать
объявление
@contextmanager
def connection(driver, server, database, user, password):
params = f'DRIVER={{{driver}}};SERVER={server};DATABASE={database};' \
f'Trusted_Connection=no;UID={user};PWD={password}'
conn = pyodbc.connect(params)
yield conn
conn.close()
@contextmanager
def cursor(driver, server, database, user, password):
with connection(driver, server, database, user, password) as conn:
csr = conn.cursor()
yield csr
csr.close()
пример использования
with cursor(driver=self.config.driver, server=self.config.address, database=database,
user=self.config.user, password=self.config.password) as curs:
curs.execute(f'truncate table {table_name}')
curs.commit()
или можно использовать конекшн, а не курсор напрямую (пандас работает через конекшн)
with connection(driver=self.config.driver, server=self.config.address, database=database,
user=self.config.user, password=self.config.password) as conn:
df = pandas.read_sql(script, conn)
Top comments (0)