覆盖sqlalchemy反射表中的默认值

Ben*_*ord 1 python sqlalchemy

我在一个现有的mysql数据库中反映了一大堆表.我想表示任何表中某个名称的任何列都默认为datetime.now().然而,天真地循环遍历表和列,只是在我发现具有某个名称的那些上设置默认值不起作用,在执行session.add()时; session.flush()我收到以下错误:

AttributeError: 'builtin_function_or_method' object has no attribute '__visit_name__'
Run Code Online (Sandbox Code Playgroud)

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

有没有人知道是否有办法做到这一点,没有经过我所有的反射表,并添加列(..)行所有做同样的事情或诉诸真正丑陋的黑客?

Ant*_*sma 6

另一种选择是覆盖需要默认值的列,同时反映:

Table('some_table', metadata,
    Column('create_time', DateTime, default=datetime.now),
    autoload=True)
Run Code Online (Sandbox Code Playgroud)

遗憾的是,您目前无法反映数据类型并同时设置SQLAlchemy端默认值.有人可能会争辩说,数据类型是接口定义的一部分,因此冗余不会产生维护问题 - 如果列数据类型发生更改,则您很可能也需要更改默认值函数.


Ben*_*ord 5

好吧,我已经解决了这个问题,这是一个中等可怕的黑客,因为我使用的是内部方法.你需要这样做:

from sqlalchemy.schema import ColumnDefault
#....
ColumnDefault(callable)._set_parent(column)
Run Code Online (Sandbox Code Playgroud)

这会产生所需的行为.请注意,您也可以传递ColumnDefault kwarg for_update = True,这将改变UPDATE上的行为而不是插入.

我觉得很脏:-(