Существует способ с использованием модуля traceback
, который извлекает информацию о трассировке:
import traceback
import sys
try:
def func():
raise TypeError:
func()
except TypeError:
e = sys.exc_info()[2]
print(traceback.extract_tb(e)[0][3])
, который печатает
func()
Посмотрите на полный вывод traceback.extract_tb(e)
как он дает список кортежей для каждого уровня в стеке вызовов. Каждый из них содержит (file, line_no, module_or_func, line_text)
, и вы можете изменить, какие значения вы используете. В этом примере я использовал line_text снизу стека (первое, что нужно вызвать).
SELECT contentID
FROM tags
WHERE tagID in (334, 338, 342)
GROUP BY contentID
HAVING COUNT(DISTINCT tagID) = 3
--In general
SELECT contentID
FROM tags
WHERE tagID in (...) --taglist
GROUP BY contentID
HAVING COUNT(DISTINCT tagID) = ... --tagcount
Вот решение, которое работало намного быстрее, чем для меня на очень большой базе данных объектов и тегов. Это - пример для пересечения с тремя тегами. Это просто цепочки много соединений на таблице тега object (objtags
) указать на тот же объект и предусматривает идентификаторы тега в WHERE
пункт:
SELECT w0.objid
FROM objtags t0
INNER JOIN objtags t1 ON t1.objid=t0.objid
INNER JOIN objtags t2 ON t2.objid=t1.objid
WHERE t0.tagid=512
AND t1.tagid=256
AND t2.tagid=128
Я понятия не имею, почему это работает быстрее. Это было вдохновлено поисковым кодом в сервере MusicBrainz. Делая это в Пост-ГРЭС, я обычно заканчиваю ~8-10x ускорение HAVING COUNT(...)
решение.
Единственным альтернативным путем я могу думать:
select a.contentid from tags a
inner join tags b on a.contentid = b.contentid and b.tagid=334
inner join tags c on a.contentid = c.contentid and c.tagid=342
where a.tagid=338
Я не знаю, лучше ли это, но это могло бы быть более удобно в сопровождении
select contentid from tags where tagid = 334
intersect
select contentid from tags where tagid = 338
intersect
select contentid from tags where tagid = 342
Необходимо было бы создать его динамично, который не будет так же плох как исходное решение.
Какой SQL? SQL Server MS, Oracle, MySQL?
В SQL Server не делает это приравнивается к:
select contentid from tags where tagid IN (334,338,342)