2015-04-08 5 views
0

У меня есть объект MyModel, который наследуется от Model из SQLAlchemy. Доступ к первичному ключу (ID), кажется, займет гораздо больше времени, чем любой другой атрибут:Flask-SqlAlchemy-Python getattr() speed

value = getattr(model, ID) 

занимает ~ 1.4ms, чтобы вычислить или получить значение, но,

value = getattr(model, <any_other_column>) 

принимает экспоненциально меньше времени, чтобы получить значение этого столбца независимо от того, какой тип он может быть? Есть ли более быстрый способ получить первичное значение ключа из объекта модели?

+1

Установите 'SQLALCHEMY_ECHO = True' в конфигурацию Flask и повторите попытку. У меня такое чувство, потому что первый доступ требует загрузки данных из db, а последующие обращения имеют уже загруженные данные. Это не какой-то определенный attr, который медленный, только первый. – davidism

ответ

2

Включить отладку SQLAlchemy и посмотреть, какие SQL-запросы выполняются. Мое предположение заключается в том, что у вас есть объект, срок действия которого истекает в соответствии с SQLAlchemy, и когда вы пытаетесь получить первый атрибут, он должен прочитать данные из базы данных. Когда вы делаете то же самое снова (по любому атрибуту), он должен быть быстрым снова. Обычно такая ситуация возникает, если вы извлекаете некоторые объекты из базы данных, фиксируете сеанс, а затем пытаетесь снова использовать ранее извлеченные объекты. Это происходит потому, что при фиксации SQLAlchemy не знает, не изменили ли другие транзакции данные, поэтому они должны снова их получить.

+0

Ваше предположение верно! Если бы я попытался getattr() из другого поля сначала, то Id, первый attr займет больше времени, чем другой. Спасибо, что помогли мне! –