Все остальные ответы здесь просто невероятны, но даже несмотря на то, что в вашем вопросе конкретно упоминается проверка компилятора, я чувствую, что эта страница была бы неполной без хотя бы подсказки QuickCheck . QuickCheck выполняет свою работу во время выполнения, а не в системе типов во время компиляции, но это отличный инструмент для тестирования свойств, которые могут быть слишком сложными или неудобными для статического выражения в системе типов.
Я бы подумал, можно ли создать представления для этих таблиц, которые отфильтровывают удаленные элементы, и тогда вы могли бы напрямую отображать это представление вместо базовой таблицы, по крайней мере, для операций запросов. Однако сам никогда не пробовал!
Вы можете сопоставить выбор. Например:
mapper(EmailInfo, select([email_join], email_join.c.deleted == False))