Я прочитал документацию по транзакциям, но все еще немного потерял, как я должен это делать.Допустим, у меня есть класс Book (имя, содержимое, left_key, right_key, level) в models.py с методами, которые хранят содержимое книги в виде вложенных наборов.Основной метод, который я хочу использовать:
@transaction.commit_on_success
def add_node(self,right,level):
cursor = connection.cursor()
cursor.execute("UPDATE cms_Book SET left_key = left_key + 2, right_key = right_key + 2 WHERE left_key > %s",[right])
cursor.execute("UPDATE cms_Book SET right_key = right_key + 2 WHERE right_key >= %s AND left_key < %s ",[right,right])
cursor.execute("INSERT INTO cms_Book SET left_key = %s, right_key = %s + 1, level = %s + 1, content='roar'",[right,right,level])
Но поскольку вставка в основном зависит от ключей, переданных из шаблона в качестве параметров, мне нужно проверить, вставлены ли правильные ключи. Даже если, например, вставлены неправильные ключи, узел все равно будетбудет добавлено, и ничего не сломается, и никакое исключение не произойдет, но логика сломается, что не очень хорошо, в случае, если мне нужно получить определенные узлы, а не все из них.
Так что у меня есть несколько других методов, чтобы проверитьправильна ли логика или нет.Вот один из них:
def check_count(self):
q = Book.objects.aggregate(min_key = Min('left_key'),max_key= Max('right_key'),count_all = Count('id'))
return q
Что мне нужно, это отчасти выполнить все действия в методе add_node, а затем проверить, не нарушает ли логика методы проверки, если это не так, зафиксировать всев противном случае откат.Что я вроде не понимаю, так это то, что если я использую try, кроме block, мне нужно db, чтобы создать какую-то ошибку / исключение, чего не произойдет, или, например, сделать:
if (check_my_table_for_all_different_keys == none):
transactions.commit
else:
transactions.rollback
check_my_table_for_all_different_keys - ничего не возвращает, если все ключи уникальны, в противном случае возвращает id объектов, которые идентичны или имеют одинаковые ключи.Также я не уверен, как именно должна выглядеть деталь, где я фиксирую все 3 транзакции, в случае, если моя логика на если - еще структура верна, что я думаю, нет.