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 declarative syntax?
For example, with this structure:
Base = declarative_base(bind=engine)
class TableXYZ(Base):
__tablename__ = 'tablexyz'
The Declarative system is the typically used system provided by the SQLAlchemy ORM in order to define classes mapped to relational database tables. However, as noted in Classical Mappings, Declarative is in fact a series of extensions that ride on top of the SQLAlchemy mapper() construct.
SQLAlchemy is a library that facilitates the communication between Python programs and databases. Most of the times, this library is used as an Object Relational Mapper (ORM) tool that translates Python classes to tables on relational databases and automatically converts function calls to SQL statements.
Table arguments other than the name, metadata, and mapped Column arguments are specified using the __table_args__ class attribute. This attribute accommodates both positional as well as keyword arguments that are normally sent to the Table constructor. The attribute can be specified in one of two forms.
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With