Задать вопрос
@Hanharr

Как лучше написать функцию соединения с БД?

Всем доброго времени суток.

Подскажите, при работе с базами данных как лучше оформить код для соединения с БД, закрытием соединения и собственно запросами к БД?

Как я понимаю можно создать функции create_connection(params), close_connection(conn) и для каждого запроса сделать отдельную функцию куда передавать курсор. Или, можно сделать как в коде ниже:
spoiler
#!/usr/bin/env python3

import pyodbc

MySQL_PARAMS = (
    'DRIVER={FreeTDS};'
    'Server=;'
    'Database=;'
    'UID=;'
    'PWD='
)

MSSQL_PARAMS = (
    'DRIVER={ODBC Driver 17 for SQL Server};'
    'Server=;'
    'Database=;'
    'UID=;'
    'PWD='
)


def exec_request(connection, req):
    with pyodbc.connect(connection) as conn:
        with conn.cursor() as cur:
            cur.execute(req)
            return cur.fetchall()


def get_user_list():
    req = '''
        SELECT id, phone_mobile
        FROM `users`
        WHERE user_name='user1'
    '''

    return req


def get_office_hours():
    req = '''
        Declare @now datetimeoffset = DATEADD(day,-1,FORMAT(SYSDATETIME(),'yyyy-MM-dd'));

        select message, DateTime, SUBSTRING(Details,21,25) as CardKey
            from [RusGuardDB].[dbo].[Log] where DateTime >= @now and Details like 'по ключу%' order by datetime
    '''

    return req


def main():
    office_hours = exec_request(MSSQL_PARAMS, get_office_hours())
    id, card_num = exec_request(MySQL_PARAMS, get_user_list())[0]

    for row in office_hours:
        if card_num in row[2]:
            print(id, row[1])


if __name__ == "__main__":
    main()


Не смог найти проект, где можно было бы ознакомиться с тем, как люди работают с БД, чаще попадаются примеры с тем как соединиться с БД и что-то выполнить. Возможно, кто-то подскажет как сделать более корректно или даст ссылку на чей-либо код, где работают с БД.
  • Вопрос задан
  • 127 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@latush
Используйте ORM, например SQLAlchemy
Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
Ну возьмите для примера какую нибудь ORM, например SQLALchemy - там везде передается connection а cursor уже получается в самой функции
https://github.com/sqlalchemy/sqlalchemy/blob/mast...

А вообще полезно было бы изучить какую нибудь ORM, раз вы пытаетесь ее родить самостоятельно.

https://habr.com/ru/post/207110/
Ответ написан
Комментировать
@nukler
местный юродивый
С Sqlite немного другая история, там вообще можно кучу курсоров сделать в тех же threading и ничего за это вам не будет, в смысле они блокировать друг друга не будут.
А когда проект вырастет придется переделывать и везде тыкать локи =(
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы