How do I get alembic to emit custom DDL on after_create?

后端 未结 2 1391
无人共我
无人共我 2020-12-30 06:26

I\'ve got a couple of custom DDL statements that I want to run after create table:

update_function = DDL(\"\"\"                                                       


        
相关标签:
2条回答
  • 2020-12-30 06:49

    The table level before_create/after_create events are emitted (just not the metadata level ones). you need to make sure whatever happens in your env.py script ultimately involves those event listeners being set up.

    The code you have here looks a little suspect:

    event.listen(Session.__table__, 'after_create', update_function)
    event.listen(Session.__table__, 'after_create', update_trigger)
    

    Session.__table__ here would just be a single Table instance and that's probably not what you'd see in the alembic script. The alembic create_table command creates a Table locally and just runs a create on it, so you'd need to listen to all Table objects globally:

    from sqlalchemy import Table
    event.listen(Table, 'after_create', update_function)
    event.listen(Table, 'after_create', update_trigger)
    

    if these events are only for this one specific table though, then you wouldn't use any events, you'd just put the DDL() for those triggers directly in your migration script, right after where it calls create_table().

    0 讨论(0)
  • 2020-12-30 06:52

    Expanding on @zzzeek's answer, this helper works for me:

    from sqlalchemy import Table
    from sqlalchemy.event import listen
    from functools import partial
    
    def on_table_create(class_, ddl):
    
        def listener(tablename, ddl, table, bind, **kw):
            if table.name == tablename:
                ddl(table, bind, **kw)
    
        listen(Table,
               'after_create',
               partial(listener, class_.__table__.name, ddl))
    

    Then you'd do:

    on_table_create(Session, update_function)
    on_table_create(Session, update_trigger)
    
    0 讨论(0)
提交回复
热议问题