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