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)