celery中操作MySQL
# celery中操作MySQL,有2种方案:
1.使用原生的sql语句
2.使用django的ORM(推荐)
1.使用原生的sql语句(不推荐)
# 注意事项:
1.连接数据库的代码一定要放到任务里面去,不然会出错,老刘说:“放任务外面,celery一运行,就会创建链接,以后用的都是这个链接,会出内存溢出”
2.这种方式任务执行前都要连接数据库,很慢,一个任务60s,不推荐 (******)
@app.task()
def set_not_free(id):
conn = pymysql.connect(
host="localhost",
port=3306,
user='root',
passwd='root123',
database='xiaoheihe',
charset='utf8',
autocommit=True # 修改默认设置,使增,改,查,自动进行2次确认
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 默认查看数据时是元组格式,手动改为字典模式
sql = 'UPDATE game_game SET is_free = 0 WHERE id = %s' % id
cursor.execute(sql)
cursor.close()
return True
# 错误解析:连接数据库的代码放到任务外面,导致:
1.celery任务一直失败,或大概率失败
2.worker启动非常慢
2.使用django的ORM(推荐)
# 注意事项:
1.推荐这种方式,简单,执行效率高
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'youxihe.settings.dev')
django.setup() # 前4句引入django测试环境
from apps.game.models import Game
@app.task()
def set_free(id):
Game.objects.filter(id=id).update(is_free=True)
return True