In SQLAlchemy, how do I define an event to fire DDL using declarative syntax?

前端 未结 2 1923
自闭症患者
自闭症患者 2020-12-16 05:45

This example shows how to use it with \"non-declarative\" - http://docs.sqlalchemy.org/en/latest/core/ddl.html#sqlalchemy.schema.DDL

How can I use it with the ORM

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

    Silly example, but think this is what you're looking for, should get you going:

    from sqlalchemy import event
    from sqlalchemy.engine import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import create_session
    from sqlalchemy.schema import Column, DDL
    from sqlalchemy.types import Integer
    
    Base = declarative_base()
    engine = create_engine('sqlite:////tmp/test.db', echo=True)
    
    class TableXYZ(Base):
        __tablename__ = 'tablexyz'
        id = Column(Integer, primary_key=True)
    
    #event.listen(
    #   Base.metadata, 'after_create',
    #   DDL("""
    #   alter table TableXYZ add column name text
    #   """)
    
    event.listen(
        TableXYZ.__table__, 'after_create',
        DDL("""
        alter table TableXYZ add column name text
        """)
    )
    Base.metadata.create_all(engine)
    

    Running the above results in - note "name text" for the added column:

    sqlite> .schema tablexyz
    CREATE TABLE tablexyz (
        id INTEGER NOT NULL, name text, 
        PRIMARY KEY (id)
    );
    

    I have my code in declarative and use the event.listen to add triggers and other stored procedures. Seems to work well.

    0 讨论(0)
  • 2020-12-16 06:34

    It should be the same with "non-declarative" and "declarative".

    You register your event by specifying (with your class and the doc's event & function) :

    event.listen(TableXYZ, 'before_create', DDL('DROP TRIGGER users_trigger'))
    

    Syntax is something like:

    event.listen(Class, 'name_of_event', function)
    
    0 讨论(0)
提交回复
热议问题