一尘不染

覆盖sqlalchemy反映表中的默认值

python

我已经在现有的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(..)行,或者使用真正丑陋的黑客手段?


阅读 188

收藏
2021-01-20

共1个答案

一尘不染

五年后,您可以使用事件侦听器[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

2021-01-20