Управление подключением к базе данных при использовании только Django ORM

Я использую слой Django ORM вне Django. Проект представляет собой веб-приложение, использующее внутреннюю структуру cusotm.

Теперь у меня не было проблем с настройкой Django ORM для автономной работы, но я немного беспокоюсь об управлении соединениями. Я прочитал Использование только части БД Django здесь, в SO, и это верно, что Django выполняет специальную обработку соединения в начале и в конце каждого запроса. Из django/db/__init__.py:

# Register an event that closes the database connection
# when a Django request is finished.
def close_connection(**kwargs):
    for conn in connections.all():
        conn.close()
signals.request_finished.connect(close_connection)

# Register an event that resets connection.queries
# when a Django request is started.
def reset_queries(**kwargs):
    for conn in connections.all():
        conn.queries = []
signals.request_started.connect(reset_queries)

# Register an event that rolls back the connections
# when a Django request has an exception.
def _rollback_on_exception(**kwargs):
    from django.db import transaction
    for conn in connections:
        try:
            transaction.rollback_unless_managed(using=conn)
        except DatabaseError:
            pass
signals.got_request_exception.connect(_rollback_on_exception)

С какими проблемами я могу столкнуться, если пропущу это управление подключением? (У меня нет возможности легко подключить эти сигналы к моей структуре)


person pajton    schedule 23.01.2012    source источник
comment
Проблемы с управлением соединениями; виды кода, которые вы вставили, обрабатываются для вас.   -  person Burhan Khalid    schedule 23.01.2012
comment
@burhan Я имею в виду, безопасно ли пропустить этот код? Я знаю, что некоторые ребята используют Django ORM как автономную программу, и они, вероятно, пропускают этот код, интересно, правильно ли он работает.   -  person pajton    schedule 23.01.2012


Ответы (1)


Это зависит от вашего варианта использования. Каждая из этих функций делает что-то конкретное, что может повлиять на вас, а может и не повлиять.

Если это длительный процесс и у вас включена DEBUG, вам потребуется сбросить запросы, иначе все запросы, которые вы выполнили, останутся в памяти.

Если вы создаете много потоков, подключаетесь к БД один раз в начале каждого потока, а затем оставляете потоки запущенными, вы также захотите закрыть соединения, когда закончите использовать БД, или вы можете подключиться к своей БД. предел.

Вам почти наверняка не нужен _rollback_on_exception - я предполагаю, что у вас есть предполагаемое поведение транзакции, настроенное в самом соответствующем коде.

person AdamKG    schedule 23.01.2012
comment
Я буду иметь в виду, чтобы отключить DEBUG. Для производства я, вероятно, буду использовать пул соединений pg (я использую postgres). Так что остается только _rollback_on_exception. Я планирую большую часть времени придерживаться поведения автоматической фиксации Django - будет ли это работать в этом случае? Я планирую использовать транзакции только в том случае, если это необходимо для обеспечения логической согласованности данных. - person pajton; 23.01.2012