Я вижу, что BOOLEAN
переопределяет __visit_name__
class BOOLEAN(Boolean):
__visit_name__ = 'BOOLEAN'
, который контролирует метод посетителя, выбранный диспетчером
def _compiler_dispatch(self, visitor, **kw):
visit_attr = 'visit_%s' % self.__visit_name__
try:
meth = getattr(visitor, visit_attr)
В случае MS SQL, посетительMSSQLCompiler
, что происходит от GenericTypeCompiler
.Теперь MSSQLCompiler
переопределяет visit_boolean
:
def visit_boolean(self, type_, **kw):
return self.visit_BIT(type_)
Но оно не переопределяет visit_BOOLEAN
, поэтому тип столбца Boolean
разрешается в "BIT", а BOOLEAN
(через суперкласс) -в "BOOLEAN", который не является допустимым типом MS SQL.
Почему это несоответствие?MSSQLCompiler
нужно переопределить visit_BOOLEAN
, или мне чего-то не хватает?В чем принципиальная разница между типами Boolean
и BOOLEAN
?