SQLAlchemy: эффективный способ объединения повторяющихся тегов - PullRequest
0 голосов
/ 08 октября 2011

Допустим, у меня есть база данных, полная Tag объектов.Каждый Tag имеет id и name.В начале создания базы данных я учел регистр Tags с учетом регистра, однако позже я понял, что мне не нужна / не нужна эта возможность, поэтому я начал вводить каждый name в нижний регистр перед сохранением Tag.

Теперь у меня есть все эти различные names остатки, которые теперь будут храниться в том же Tag, но раньше их не было.Например,

Trendy, trendy
NotHalfBad, Nothalfbad, nothalfbad
SQL, sql, Sql

Я использую Python и SQLAlchemy.Я создал функцию для очистки этого беспорядка, которая выглядит примерно так:

todelete = []

for t1 in Session.query(Tag):
    if t1 not in todelete: # If we haven't already encountered this tag
        for t2 in Session.query(Tag).filter_by(name_insensitive=t1.name):
            if t1.id != t2.id:
                merge(t1,t2) # Calls a function I made that merges the two tags
                todelete.append(tag)
                Session.commit()

# Mark everything for deletion
for tag in todelete:
    Session.delete(tag)

# Now commit the deletes
Session.commit()

Это ужасно неэффективно.Есть ли лучший способ?

1 Ответ

2 голосов
/ 08 октября 2011

Если это инструмент для одноразового использования, вам действительно нужно заботиться об эффективности? Просто дайте ему поработать минуту (или несколько), а не тратить еще больше времени на его оптимизацию.

При этом запросы стоят дороже, чем циклы Python, поэтому загрузка всех тегов в список сначала, а затем повторение этого списка в обоих случаях должна ускорить процесс:

for t1 in tags:
    if t1 not in todelete:
        for t2 in tags:
            if t2.name_insensitive == t1.name:
                merge(t1,t2)
                todelete.append(tag)

Также удалите вызов commit в цикле. Мало того, что это дорого, но если какой-то другой процесс изменяет БД, список тэгов, по которым вы зацикливаетесь, может быть не синхронизирован.

Конечно, правильный способ сделать вещи более эффективными - сначала профилировать, а затем концентрироваться на конкретных проблемах. Вы должны сделать это, если вы серьезно относитесь к производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...