1

既存の mysql db にテーブルの負荷を反映しています。どのテーブルの特定の名前の列も、デフォルトで datetime.now() になることを表現したいと思います。ただし、テーブルと列を素朴にループし、特定の名前を持つものにデフォルトを設定するだけでは機能しません。次のエラーが表示されます。

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

これは、_set_parent への呼び出し (およびself._init_items(*toinit)sqlalchemy.schema.

リフレクションされたすべてのテーブルを調べて、すべて同じことをしたり、本当にいハックに頼ったりすることなく、どこにでも Column(..) 行を追加することなく、これを行う方法があるかどうかは誰にもわかりませんか?

4

3 に答える 3

6

別のオプションは、反映中にデフォルトが必要な列をオーバーライドすることです。

Table('some_table', metadata,
    Column('create_time', DateTime, default=datetime.now),
    autoload=True)

残念ながら、現在、データ型を反映すると同時にSQLAlchemy側のデフォルトを設定することはできません。データ型はインターフェイス定義の一部であるため、冗長性によってメンテナンスの問題が発生することはありません。列のデータ型が変更された場合は、デフォルト値の関数も変更する必要があります。

于 2009-06-04T12:41:27.363 に答える
5

OK、私はこれを修正しました。これは、内部メソッドを使用したという点で、中程度に恐ろしいハックです。あなたがする必要があります:

from sqlalchemy.schema import ColumnDefault
#....
ColumnDefault(callable)._set_parent(column)

これにより、必要な動作が生成されます。ColumnDefault に kwarg for_update=True を渡すこともできます。これにより、挿入ではなく UPDATE で動作が変更されることに注意してください。

気持ち悪いです(-_-;)

于 2009-06-02T14:50:02.317 に答える
3

5 年後、イベント リスナーを使用できるようになります[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/en/latest/core/events.html#sqlalchemy.events.DDLEvents.column_reflect [2] http://docs.sqlalchemy.org/en/latest/core/event .html#sqlalchemy.event.listen

于 2014-06-02T17:04:01.040 に答える