Почему миграции направляющих определяют внешние ключи в приложении, но не в базе данных?

Вы можете использовать модуль dateutil, который имеет более дружественный объект относительной дельты.

import dateutil
import datetime

alpha = datetime.datetime(2012, 1, 16, 6, 0)
beta = datetime.datetime(2012, 1, 18, 10, 42, 57, 230301)
delta = dateutil.relativedelta(beta, alpha)

это дает вам объектную дельту, которая выглядит как

>>> delta
relativedelta(days=+2, hours=+4, minutes=+42, seconds=+57, microseconds=+230301)

Затем вы можете сделать

print('turnaround %i hrs %i mins %i secs' % (delta.days * 24 + delta.hours, delta.minutes, delta.seconds)

)

35
задан Welbog 24 June 2009 в 14:05
поделиться

4 ответа

Rails придерживается некоторых соглашений о том, что обеспечение целостности данных должно выполняться в приложении, а не в базе данных.

Например, Rails даже поддерживает некоторые конструкции баз данных, которые не могут использовать внешние ключи , такие как полиморфные ассоциации.

По сути, соглашения Rails рассматривают базу данных как статическое устройство хранения данных, а не как активную СУБД. Rails 2.0 - это , наконец, , поддерживающий некоторые более реалистичные функции баз данных SQL. Неудивительно, что в результате разработка с Rails станет более сложной, чем в версии 1.0.

22
ответ дан 27 November 2019 в 07:18
поделиться

Он действительно создает столбец customer_id (очевидно). Однако по большей части Rails верит в обеспечение ограничений и проверок на уровне приложения , а не на уровне базы данных; поэтому столбцы по умолчанию в Rails могут содержать значения NULL , даже если у вас есть validates_presence_of или что-то в этом роде. По мнению разработчиков Rails, такие ограничения должны обрабатываться приложением, , а не базой данных.

2
ответ дан 27 November 2019 в 07:18
поделиться

Проработав какое-то время над этой проблемой, я не думаю, что это часть основной философии Rails, что внешние ключи не должны принудительно использоваться базой данных.

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

Я думаю, что эта «философия» эволюционировала из-за использованных исходных структур тестирования: внешние ключи просто оказались огромной проблемой при использовании фикстур. Это как когда «ошибка» становится «особенностью», потому что ее никто не исправляет. (Если я неправильно помню историю, кто-нибудь меня поправит.)

Как минимум, в сообществе Rails растет движение за обеспечение целостности базы данных. Прочтите это сообщение в блоге за последний месяц. Она даже ссылается на некоторые плагины, которые помогают справляться с ошибками (и еще одно сообщение в блоге, где есть ссылки на другие плагины). Сделайте еще несколько поисков в Google; Я видел и другие плагины, которые добавляют поддержку миграции для создания внешних ключей.

Теперь то, что является частью основной философии Rails: не беспокойтесь о вещах, если вам действительно не нужно . Для многих веб-приложений вполне нормально, если небольшой (возможно, крошечный) процент записей содержит недопустимые данные. Страницы, которые могут быть затронуты, могут просматриваться очень редко, либо ошибка уже может быть обработана изящно. А может быть дешевле (например, Cold Hard Cash), чтобы решать проблемы вручную в течение следующих 6 месяцев по мере роста приложения, чем сейчас тратить ресурсы на планирование ресурсов разработки для каждого непредвиденного случая. По сути, если в ваших сценариях использования это не кажется важным, и это может быть вызвано только состоянием гонки, которое может произойти 1/10000000 запросов ... ну, стоит ли оно того?

Итак, мой прогноз таков. эти инструменты появятся, чтобы лучше справляться со всей ситуацией по умолчанию, и в конечном итоге они будут объединены в Rails 3. А пока, если вашему приложению это действительно нужно, добавьте их. Это вызовет небольшую головную боль при тестировании, но ничего, что вы не сможете преодолеть с помощью заглушек и заглушек. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)

и это действительно может быть вызвано только состоянием гонки, которое может произойти 1/10000000 запросов ... ну, это того стоит?

Итак, я предсказываю, что появятся инструменты, которые по умолчанию будут лучше справляться со всей ситуацией, и в конечном итоге они будут объединены в Rails 3. А пока, если вашему приложению это действительно нужно, добавьте их. Это вызовет небольшую головную боль при тестировании, но ничего, что вы не сможете преодолеть с помощью заглушек и заглушек. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)

и это действительно может быть вызвано только состоянием гонки, которое может произойти 1/10000000 запросов ... ну, это того стоит?

Итак, я предсказываю, что появятся инструменты, которые по умолчанию будут лучше справляться со всей ситуацией, и в конечном итоге они будут объединены в Rails 3. А пока, если вашему приложению это действительно нужно, добавьте их. Это вызовет небольшую головную боль при тестировании, но ничего, что вы не сможете преодолеть с помощью заглушек и заглушек. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)

не обходиться с моками и заглушками. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)

не обходиться с моками и заглушками. А если вашему приложению это действительно не нужно ... что ж, у вас уже все хорошо. :)

13
ответ дан 27 November 2019 в 07:18
поделиться

Одна ошибка, которую делают многие люди, - это путают миграции с моделью. Миграции просто изменяют базу данных и не имеют ничего общего с определенными вами моделями. В результате этой путаницы многие плагины внешнего ключа пытаются объединить модель с миграциями и делают слишком много волшебных вещей.

Для миграции я бы использовал http://github.com/matthuhiggins/ иностранец / дерево / хозяин . Вам не нужно менять свои модели, чтобы внешние ключи работали с Rails.

4
ответ дан 27 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: