覆盖sqlalchemy反映表中的默认值

发布于 2021-01-29 14:59:33

我已经在现有的mysql数据库中反映了表的负载。我想表示的是,任何表中具有特定名称的任何列默认为datetime.now()。但是,天真地遍历表和列,仅对那些我发现具有特定名称的表和列设置默认设置是行不通的。session.flush()我收到以下错误:

AttributeError: 'builtin_function_or_method' object has no attribute '__visit_name__'

这似乎与对_set_parent的调用(以及在sqlalchemy.schema的self._init_items(*toinit)第721行中的调用)有关。

有谁知道是否有办法做到这一点,而不必遍历我所有的反射表并在所有做相同事情的地方都添加Column(..)行,或者使用真正丑陋的黑客手段?

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    五年后,您可以使用事件侦听器[1]。您可以向监听器注册要运行的函数:

    def do_this_on_column_reflect(inspector, table, column_info):
        column_name = column_info.get("name")
        if column_name == "create_datetime":
            column_info["default"] = datetime.now()
    event.listen(Table, "column_reflect", do_this_on_column_reflect)
    

    [1] http://docs.sqlalchemy.org/zh-
    CN/latest/core/events.html#sqlalchemy.events.DDLEvents.column_reflect

    [2] http://docs.sqlalchemy.org/zh-CN/latest/core/event
    .html#sqlalchemy.event.listen



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看