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



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

这可能是非官方的,我不确定它是否能在MSSQL上工作,而不是PostgreSQL(正如这个更改日志似乎建议的那样),但是通过用自定义子类替换sqlalchemy.dialects.mssql.base.ischema_names字典上的'datetime2'项,如果官方推荐的修改结果处理的方法失败,您可能能够覆盖用于该类型的所有反射的SQLAlchemy类型。

最新更新