SQLAlchemy布尔与布尔

SQLAlchemy布尔与布尔,sqlalchemy,Sqlalchemy,我可以看到BOOLEAN覆盖\uu访问\u名称\uuuu 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)

我可以看到
BOOLEAN
覆盖
\uu访问\u名称\uuuu

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\u boolean

def visit_boolean(self, type_, **kw):
    return self.visit_BIT(type_)
但它不会覆盖
visit_BOOLEAN
,因此列类型
BOOLEAN
解析为“BIT”,而
BOOLEAN
(通过超类)解析为“BOOLEAN”,这不是有效的MS SQL类型

为什么会出现这种不一致?
MSSQLCompiler
是否需要覆盖
visit\u BOOLEAN
,或者我缺少什么?从概念上讲,
Boolean
Boolean
类型之间有什么区别?

是:

泛型类型指定可以读取、写入和存储特定类型Python数据的列。当发出
createtable
语句时,SQLAlchemy将选择目标数据库上可用的最佳数据库列类型

是一个:

这类类型指的是SQL标准的一部分,或者可能在数据库后端的子集中找到的类型。与“泛型”类型不同,SQL标准/多供应商类型可以保证在所有后端上工作,并且只在那些通过名称明确支持它们的后端上工作。也就是说,当发出
CREATE TABLE
时,类型将始终在DDL中发出其确切名称


没有不一致的地方,因为它们是不同的东西。

因此,如果我想
创建表
使用任何数据库(允许SQLAlchemy使用最佳类型),那么我需要使用泛型类型。但是如果我想精确地控制类型,那么我需要使用SQL类型。