Python sqlalchemy:使模式反射为所有实例查找/使用自定义类型
我正试图覆盖SQLAlchemyPython 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
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值
?虽然它们通常是等价的,但我不确定在每种情况下是否都是如此,特别是在直接子类化本机类型时。