我已经在现有的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行中的调用)有关。
self._init_items(*toinit)
有谁知道是否有办法做到这一点,而不必遍历我所有的反射表并在所有做相同事情的地方都添加Column(..)行,或者使用真正丑陋的黑客手段?
五年后,您可以使用事件侦听器[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