Latest posts on Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных? topichttps://python.su/forum/topic/26619/2015-03-20T15:24:19+02:00Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-20T15:24:19+02:00qnica142683<blockquote><em>4kpt_III</em><br/>Но Вы опять колдуете Неужели в объекте нет ни одного поля, которое можно было бы обновить и проверить. Запись хранит только время?</blockquote><blockquote><em>sander</em><br/>как происходит актуализация? изменение поля update?</blockquote><br/>Наверное я не правильно выразился. По мимо времени есть другие поля, но содержимое их не менялось. Т.е. нужно принудительно их перезаписать.
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T19:37:02+02:00sander142615<strong>qnica</strong><br/>не совсем понимаю что вы делаете<br/>как происходит актуализация? изменение поля update?<br/>что имеется в виду под оповещением клиента?
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T18:06:24+02:004kpt_III142600<strong>qnica</strong><br/>Мало того, что он неверный, он еще губителен. <br/><br/>По второму вопросу. Попробуйте метод .update(). Но Вы опять колдуете <img src="/static/djangobb_forum/img/smilies/smile.png" /> Неужели в объекте нет ни одного поля, которое можно было бы обновить и проверить. Запись хранит только время? Тогда спроектированная БД, как бы не было печально, неверна в принципе…
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T18:02:18+02:00qnica142599По условию у каждой записи должн быть свой период актуализации. Когда запись “протухает” об этом оповещается клиент, который сверяет данные и если все нормально, то сохраняет запись, тем самым актуализируя ее.<br/>В приемочном тесте я действую от роли пользователся, дергая рест апи. По этому я использую freezegun и стараюсь не вмешиваться в процессы создания записей руками.
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T17:53:39+02:00sander142598пропробуй явно время задать зачем freezegun<br/>и зачем обновлять запись если поля не изменились?
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T17:18:03+02:00qnica142595Это приемочный тест. Хотелось бы в нем все механизмы отфиксировать.<br/>Мне просто не понятно где именно нужен патч для datetime. Ведь если я подсовываю в самой модели лямюду в default то все работает нормально:<br/><div class="code"><pre><span class="n">created</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">DateTime</span><span class="p">(),</span> <span class="n">default</span><span class="o">=</span><span class="k">lambda</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">())</span>
</pre></div><br/>P.S. Еще вопрос немного не по теме. А как принудительно обновить запись если поля не менялись(что бы сработали только функции на <em>onupdate</em>)?<br/>Я недавно начал использовать Flask+SQLAlchemy, до этого все проекты были на Django. И иногда возникает мысль: “Ага, на джанго я это делал так, а как мне это же сделать c алхимеей”. Хотя может это не совсем верный подход<img src="/static/djangobb_forum/img/smilies/smile.png" />
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T16:50:00+02:004kpt_III142592Сложновато Вы придумали. Я бы в тесте сохранил время создания и после обновления проверил бы, что времена не совпадают. Или нужна повышенная точность? Просто подмена для такого теста уж как-то слишком витиевато <img src="/static/djangobb_forum/img/smilies/smile.png" />
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T16:39:30+02:00qnica142591У меня была опечатка в последнем ассерте.<br/>Вообще это выдернута часть теста. В тесте между сохранениями дергается рест апи.<br/>Суть этого фрагмента: сохранять в заданное время сущность и проверить что ее время обновления, то, в которое мы его сахранили.
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T16:02:30+02:004kpt_III142590Что Вы тестируете? Я, если честно, понять не могу <img src="/static/djangobb_forum/img/smilies/sad.png" />
Общий :: Базы данных :: Как при помощи mock и SQLAlchemy изменить дату при автосохранении объекта в базу данных?
2015-03-18T15:14:26+02:00qnica142587Добрый день. Использую Flask + SQLAlchemy.<br/>Имеется модель такого типа:<br/> <div class="code"><pre><span class="k">class</span> <span class="nc">Entry</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="n">__tablename__</span> <span class="o">=</span> <span class="s">'entries'</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">100</span><span class="p">))</span>
<span class="n">created</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">DateTime</span><span class="p">(),</span> <span class="n">default</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">)</span>
<span class="n">updated</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">DateTime</span><span class="p">(),</span> <span class="n">default</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">,</span> <span class="n">onupdate</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">)</span>
</pre></div><br/>Как подменить время создания и обновления? К примеру для такого теста:<br/><div class="code"><pre><span class="k">class</span> <span class="nc">ViewTestCase</span><span class="p">(</span><span class="n">AppliactionTestCase</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">with</span> <span class="n">freeze_time</span><span class="p">(</span><span class="s">"2014-06-01 16:00:00"</span><span class="p">):</span>
<span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Entry</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">"title"</span><span class="p">))</span>
<span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Entry</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">created</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2014</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">updated</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2014</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
<span class="k">with</span> <span class="n">freeze_time</span><span class="p">(</span><span class="s">"2014-07-01 17:00:00"</span><span class="p">):</span>
<span class="n">entry</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">'edited title'</span>
<span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">entry</span><span class="p">)</span>
<span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
<span class="n">entry</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Entry</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">created</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2014</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">updated</span><span class="p">,</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2014</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
</pre></div><br/>Для подмены времения я использую <a href="https://github.com/spulec/freezegun">freezegun</a>. Но с ходу он не подменяет.<br/>Я также пытался с помощью mock патчить db.DateTime.python_type, что бы он возвращал FakeDatetime, но результат тот же.<br/><br/>Я обратил внимание что если определять поля так:<br/><div class="code"><pre><span class="n">created</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">DateTime</span><span class="p">(),</span> <span class="n">default</span><span class="o">=</span><span class="k">lambda</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">())</span>
</pre></div>То все работает. Но переписывать все под тесты не охота, да и неправильно это.<br/><br/>Подскажите, если кто сталкивался с этим, или знает где нужно подменить метод, отзовитесь, пожалуйста.