sqlalchemy触发器的使用-Event

本文介绍SQLAlchemy中的事件机制,通过示例演示如何使用这些事件来触发特定的操作,如记录插入等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说是触发器,其实并不是触发器,这是sqlalchemy中的钩子,也称为事件,在触发某个操作的时候执行某个函数,和sql中的触发器时一样的,更加灵活简单。 
我现在也正在学习,我就直接拿出来一个例子吧,大家可以测试一下。

#coding:utf8

from sqlalchemy.orm import scoped_session
from sqlalchemy import Column, Integer, String, DateTime, TIMESTAMP, DECIMAL, func, Text, or_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy import ForeignKey, Boolean, create_engine, MetaData, Constraint
from sqlalchemy.orm import relationship, backref, sessionmaker
from sqlalchemy import event


Base = declarative_base()


class Role(Base):#  一
    __tablename__= 'roles'
    id = Column(Integer,primary_key=True)
    name = Column(String(36),nullable=True)
    users = relationship('User',backref='role')

class User(Base):#  多
    __tablename__ = 'users'
    id = Column(Integer,primary_key=True)
    name = Column(String(36),nullable=True)
    role_id = Column(Integer, ForeignKey('roles.id'))


class Database():
    def __init__(self, bind, pool_size=100, pool_recycle=3600, echo=False):
        self.__engine = create_engine(bind,pool_size=pool_size,
                                   pool_recycle=pool_recycle,
                                   echo=echo)
        self.__session_factory = sessionmaker(bind=self.__engine)
        self.__db_session = scoped_session(self.__session_factory)
        Base.metadata.create_all(self.__engine)

    @property
    def session(self):
        return self.__db_session()


def on_created(target, value, initiator):
    print "received append event for target: %s" % target



@event.listens_for(User, 'after_insert')
def receive_after_insert(mapper, connection, target):
    print mapper
    print connection
    print target.id
    print "insert......."

db = Database(bind="mysql+pymysql://root:xxxx@localhost/mydata?charset=utf8")



if __name__ == "__main__":
    user = User()
    user.name = "123"
    user.role_id=2
    db.session.add(user)
    db.session.commit()

在插入数据后会执行receive_after_insert函数,很简单。 
如果想深入的学习建议看官方文档,说的很详细 
http://docs.sqlalchemy.org/en/latest/orm/events.html#attribute-events

转载于:https://my.oschina.net/lemonwater/blog/1616946

<think>我们正在处理关于APScheduler的使用教程或示例代码的请求。根据引用内容,我们有几个相关的引用片段:引用[1]展示了Flask-APScheduler的基本设置代码:```pythonfromflaskimportFlaskfromflask_apschedulerimportAPSchedulerclassConfig:SCHEDULER_API_ENABLED=Trueapp=Flask(__name__)app.config.from_object(Config)scheduler=APScheduler()scheduler.init_app(app)scheduler.start()if__name__=='__main__':app.run()```引用[2]说明了APScheduler的定位:它是一个跨平台的调度库,用于在现有应用程序中运行,而不是作为独立的守护进程或服务。引用[3]提到在Flask中使用APScheduler时,由于任务可能耗时,建议使用线程异步处理。但该引用没有给出具体代码。引用[4]是关于Django-APScheduler的目录结构,但没有具体使用代码。引用[5]总结了在Flask中使用APScheduler的要点:使用线程池异步处理,配置调度器、作业存储、执行器和触发器,以及使用轮询方式处理复杂步骤。用户要求的是APScheduler的使用方法或教程,而不仅仅是Flask或Django中的集成。因此,我们需要提供一个通用的APScheduler教程,同时也可以包含在Flask或Django中使用的示例。由于引用中提供了Flask-APScheduler的示例,我们可以先展示一个通用的APScheduler示例,然后展示与Flask集成的示例。###通用APScheduler使用步骤1.安装APScheduler:`pipinstallapscheduler`2.选择调度器(Scheduler)、作业存储(JobStore)、执行器(Executor)和触发器(Trigger)。3.创建调度器实例并配置。4.添加作业(Job)。5.启动调度器。###示例代码:一个简单的APScheduler脚本```pythonfromapscheduler.schedulers.blockingimportBlockingSchedulerdefmy_job():print("Hello,APScheduler!")#创建调度器实例,使用默认的作业存储(内存)和执行器(线程池)scheduler=BlockingScheduler()#添加作业,使用间隔触发器,每5秒执行一次scheduler.add_job(my_job,'interval',seconds=5)#启动调度器scheduler.start()```###在Flask中使用APScheduler(基于引用[1])在Flask中,我们可以使用Flask-APScheduler扩展,它封装了APScheduler,并提供了与Flask应用的集成。```pythonfromflaskimportFlaskfromflask_apschedulerimportAPSchedulerclassConfig:SCHEDULER_API_ENABLED=True#启用API(可选)app=Flask(__name__)app.config.from_object(Config)#初始化调度器scheduler=APScheduler()scheduler.init_app(app)#将调度器与Flask应用关联#定义一个要执行的任务defscheduled_task():print("Thistaskisrunningevery5seconds")#在调度器中添加任务scheduler.add_job(id='task1',func=scheduled_task,trigger='interval',seconds=5)#启动调度器scheduler.start()if__name__=='__main__':app.run()```注意:在Flask应用中,调度器会在启动应用时启动。上面的代码中,调度器任务在后台线程中运行,而Flask应用在主线程中运行。###在Django中使用APScheduler在Django中,通常没有像Flask-APScheduler这样的扩展,但我们可以使用自定义管理命令或应用启动时运行调度器。一个常见的做法是在Django项目的`apps.py`中,当应用准备就绪时启动调度器(注意:这依赖于Django的启动信号)。首先,安装APScheduler:`pipinstallapscheduler`然后,在一个Django应用中,修改`apps.py`:```pythonfromdjango.appsimportAppConfigfromapscheduler.schedulers.backgroundimportBackgroundSchedulerdefmy_job():print("DjangoAPSchedulerJob")classMyAppConfig(AppConfig):name='myapp'defready(self):#当Django应用准备就绪时调用scheduler=BackgroundScheduler()scheduler.add_job(my_job,'interval',seconds=5)scheduler.start()```同时,在项目的`settings.py`中,将该应用配置类完整路径加入设置:```pythonINSTALLED_APPS=[...'myapp.apps.MyAppConfig',#使用自定义的AppConfig...]```注意:在Django开发服务器中,由于自动重载机制,可能会启动多个调度器实例,因此生产环境中使用这种方式需要谨慎。另一种做法是使用自定义管理命令来启动调度器。###总结APScheduler是一个功能强大的Python调度库,可以用于各种应用场景。在Flask中,可以使用Flask-APScheduler扩展简化集成;在Django中,可以通过自定义管理命令或应用启动时初始化调度器。希望这些示例能帮助您开始使用APScheduler。§§相关问题§§1.APScheduler有哪几种调度器(Scheduler)类型?2.APScheduler支持哪些作业存储(JobStore)?3.如何避免APScheduler在Django开发服务器中重复启动?4.APScheduler的触发器(Trigger)有哪些类型?</think>### APScheduler 使用教程与示例代码 APScheduler 是一个轻量级的 Python 定时任务调度库,支持多种调度方式(如定时、间隔、cron式)。以下是核心使用方法和示例: #### 一、基础安装 ```bash pip install apscheduler ``` #### 二、核心组件 1. **调度器 (Scheduler)** 管理任务调度,常用类型: - `BlockingScheduler`:阻塞式(适合独立脚本) - `BackgroundScheduler`:后台运行(适合集成到应用) - `AsyncIOScheduler`:异步IO环境 2. **触发器 (Trigger)** 定义任务执行时机: - `date`:单次执行 `(trigger='date', run_date=datetime(2023,10,1))` - `interval`:间隔执行 `(trigger='interval', seconds=30)` - `cron`:类cron表达式 `(trigger='cron', hour=9, minute=30)` 3. **作业存储 (Job Store)** 支持内存、SQLAlchemy、Redis等 4. **执行器 (Executor)** 控制任务执行方式(线程池/进程池) --- ### 示例代码 #### 示例1:基础定时任务 ```python from apscheduler.schedulers.blocking import BlockingScheduler from datetime import datetime def job(): print(f"执行任务: {datetime.now()}") scheduler = BlockingScheduler() # 每10秒执行一次 scheduler.add_job(job, 'interval', seconds=10) scheduler.start() ``` #### 示例2:Flask集成(基于引用[1][3]) ```python from flask import Flask from flask_apscheduler import APScheduler app = Flask(__name__) scheduler = APScheduler() # 配置(启用API和任务) app.config["SCHEDULER_API_ENABLED"] = True app.config["JOBS"] = [{ "id": "task1", "func": "module:periodic_task", # 模块:函数名 "trigger": "cron", "hour": 14 }] scheduler.init_app(app) scheduler.start() def periodic_task(): print("每日14点执行的任务") if __name__ == '__main__': app.run() ``` #### 示例3:Django集成(基于引用[4]) ```python # 在django_apscheduler/management/commands/run_scheduler.py from django.core.management.base import BaseCommand from apscheduler.schedulers.blocking import BlockingScheduler class Command(BaseCommand): help = '启动定时任务' def handle(self, *args, **options): scheduler = BlockingScheduler() scheduler.add_job(daily_backup, 'cron', hour=2) # 每天2点备份 scheduler.start() def daily_backup(): print("执行数据库备份") ``` --- ### 关键配置项 | 配置项 | 说明 | 示例值 | |--------|------|--------| | `SCHEDULER_JOBSTORES` | 作业存储 | `{'default': SQLAlchemyJobStore(url='sqlite:///jobs.db')}` | | `SCHEDULER_EXECUTORS` | 执行器 | `{'default': {'type': 'threadpool', 'max_workers': 20}}` | | `SCHEDULER_JOB_DEFAULTS` | 任务默认参数 | `{'coalesce': True, 'max_instances': 3}` | --- ### 最佳实践 1. **异步处理耗时任务** 如引用[3][5]所述,使用线程池避免阻塞主进程: ```python from concurrent.futures import ThreadPoolExecutor scheduler.add_executor(ThreadPoolExecutor(max_workers=5)) ``` 2. **任务持久化** 使用数据库存储任务状态(SQLite/MySQL等): ```python from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore jobstores = {'default': SQLAlchemyJobStore(url='sqlite:///jobs.db')} scheduler = BackgroundScheduler(jobstores=jobstores) ``` 3. **错误处理** 添加任务异常监听: ```python def task_listener(event): if event.exception: print(f"任务失败: {event.job_id}") scheduler.add_listener(task_listener) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值