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

我正在尝试覆盖SQLAlchemy DATETIME2类型(从MS SQL Server)以丢弃额外的亚秒级精度数字,如果有必要强制转换为本机
Python日期时间类型,如文档的
Replacing the Bind Result Processing of Existing Types部分所述,如下所示:

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.dialects.mssql.base.DATETIME2而不是TruncatingPrecisionDATETIME2的实例.对于所有DATETIME2实例,我需要做些什么才能全局更改?

最佳答案 这可能是非官方的,我不确定它甚至可以在MSSQL上工作而不是PostgreSQL(
as this changelog might seem to suggest),而是通过你的自定义替换sqlalchemy.dialects.mssql.base.ischema_names字典中的’datetime2’项子类,如果修改结果处理的官方推荐方法失败,您可以覆盖用于该类型的所有反射的SQLAlchemy类型.

点赞