Python sqlalchemy:使模式反射为所有实例查找/使用自定义类型

Python sqlalchemy:使模式反射为所有实例查找/使用自定义类型,python,sqlalchemy,Python,Sqlalchemy,我正试图覆盖SQLAlchemyDATETIME2类型(来自MS SQL Server),以便在必要时丢弃亚秒精度的额外数字,以强制转换为本机Python日期时间类型,如文档部分所述,如下所示: import re import sqlalchemy.dialects as sa_dialects class TruncatingPrecisionDATETIME2(sa_dialects.mssql.base.DATETIME2): __visit_name__ = 'DATETIM

我正试图覆盖SQLAlchemy
DATETIME2
类型(来自MS SQL Server),以便在必要时丢弃亚秒精度的额外数字,以强制转换为本机Python日期时间类型,如文档部分所述,如下所示:

import re
import sqlalchemy.dialects as sa_dialects

class TruncatingPrecisionDATETIME2(sa_dialects.mssql.base.DATETIME2):
    __visit_name__ = 'DATETIME2'
    _reg = re.compile(r"(\d+):(\d+):(\d+)(?:\.(\d{0,6})\d*)?")

    def process_result_value(self, value, dialect):
        if isinstance(value, util.string_types):
            return datetime.time(*[
                int(x or 0)
                for x in self._reg.match(value).groups()])
        else:
            return value

    def adapt(self, impltype):
        return TruncatingPrecisionDATETIME2()

但是,当我调用
meta.reflect()
并检查数据库中类型为
DATETIME2
的列的类型时,它是
sqlalchemy.dialogs.mssql.base.DATETIME2
的实例,而不是
truncingPrecisiondatetime2
。对于所有DATETIME2实例,我需要做什么来全局更改它呢?

这可能是非正式的,我不确定它是否能在MSSQL上工作,而不是在PostgreSQL()上工作,但是通过将
sqlalchemy.dialogs.MSSQL.base.ischema_names
字典上的“DATETIME2”项替换为自定义子类,如果官方推荐的修改结果处理的方法失败,您可以覆盖用于该类型的所有反射的SQLAlchemy类型。

您发布的链接似乎并不一定意味着反射类型本身将更改为子类本身,只是将替换绑定结果处理。您是否检查了处理是否被(或没有)无形地覆盖。如果没有,您是否尝试覆盖
结果\u处理器
方法(如最初所示),而不是
处理结果\u值
?虽然它们通常是等价的,但我不确定在每种情况下是否都是如此,特别是在直接子类化本机类型时。