Pertanyaan Di dalam SQLAlchemy, bagaimana saya mendefinisikan suatu peristiwa untuk memecat DDL menggunakan sintaks deklaratif?


Contoh ini menunjukkan cara menggunakannya dengan "non-deklaratif" - http://docs.sqlalchemy.org/en/latest/core/ddl.html#sqlalchemy.schema.DDL 

Bagaimana saya bisa menggunakannya dengan sintaks deklaratif ORM?

Misalnya, dengan struktur ini:

Base = declarative_base(bind=engine)     
class TableXYZ(Base):
    __tablename__ = 'tablexyz'

4
2017-08-20 13:55


asal


Jawaban:


Contoh konyol, tetapi anggaplah ini yang Anda cari, harus membuat Anda pergi:

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)

Menjalankan hasil di atas - perhatikan "teks nama" untuk kolom yang ditambahkan:

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

Saya memiliki kode saya dalam deklaratif dan menggunakan event.listen untuk menambahkan pemicu dan prosedur lain yang tersimpan. Tampaknya berfungsi dengan baik.


8
2017-08-22 23:09



Itu harus sama dengan "non-deklaratif" dan "deklaratif".

Anda mendaftarkan acara Anda dengan menetapkan (dengan kelas Anda dan acara & fungsi dokumen):

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

Sintaksnya seperti:

event.listen(Class, 'name_of_event', function)

2
2017-08-20 17:11