2016-07-13 3 views
10

나는 샐러리에 대한 결과 백엔드로 MySQL을 사용하고 있습니다. DB에 프로그램 인수도 저장하려고합니다. 예를 들어쿼리 할 데이터베이스에 샐러리 작업의 인수를 입력하는 방법. mysql을 사용하여

: 내가 나중에 조회 할 수 있도록 DB에서 사용자 인수를 저장할이 경우

add.apply_async(args=[num1, num2, user] 

.

현재 DB에 저장된 인수를 반환합니다.

def add(num1, num2, user): 
    return [num1+num2, user] 

그러나 작업이 실행 중일 때 사용자가 삽입되지 않고 DB에서 쿼리 할 수 ​​없습니다. 거기에 어떤 해법이 있나요/해킹?

+1

_connect_ 할 수 없습니까? 또는 _SELECT_ 할 수 없습니까? –

답변

1

결과 백엔드로만 MySQL을 사용하고 있습니까, 아니면 큐용으로 사용하고 있습니까 (권장하지 않음)? 대기열에 사용하는 경우 작업이 전송 되 자마자 args가 데이터베이스에 있어야합니다. 그렇지 않으면 작업 결과는 작업이 완료 될 때까지 저장할 수 없습니다.

태스크가 실행되는 동안 인수가 조회 가능해야하는 경우, 태스크 시작시 DB 테이블에 수동으로 인수를 삽입해야합니다. 작업을 시작하기 전에 이들을 쿼리 할 수있게하려면 apply_async을 호출하기 전에 DB 테이블에 삽입해야합니다.

+0

감사! 거기에 문제가 하나 있습니다. 각 명령을 제출하는 동안 새 DB 연결이 열리고 여러 cmds가 실행될 때 문제가 발생할 수 있습니다. 나는 DB 연결을 또한 취급 할지도 모른 어떤 셀러리를 찾고 있었다. – Rajs123

+0

오픈 DB 연결 풀을 사용하는 것이 좋습니다. –

0

데이터베이스에 연결하여 선택할 수 있다고 가정하면 매개 변수를 쿼리하는 함수와 callback 함수를 분리하여 결과를 db에 저장할 수 있습니다.

Add()은 결과를 처리하고 store_callback()은 준비가되면 데이터베이스에 저장합니다. 매개 변수가 준비되면 코드가 다음 작업으로 이동하여 완료되면 결과 (사용자)를 저장할 수 있습니다. 같은

뭔가 :

def store_callback(result): 
    sql_insert = 'INSERT INTO your_table VALUES(?, ?,)' 
    curs.execute(sql_insert, result) #result is a list passed from add() 

def add(num1, num2, user): 
    return [num1+num2, user] 


# check parameters are present in db: 
curs.execute("SELECT * FROM your_table WHERE user = ?", [_user]) 
user_exists = curs.fetchone() 
# 
if user_exists: 
    add.apply_async((num1, num2, user,) , link=store_callback.s()) 

당신도 다른 작업에()를 추가 연결할 수 있습니다.

+0

콜백은 작업이 실행 된 후 결과를 저장합니다. 실행 중에 작업 상태, cmd 및 인수 (주어진 작업 ID)를 쿼리해야합니다. – Rajs123

0

대기열이 필요하고 각 사용자는 자신을 위해 대기열을 만들고 셀러리 작업은 사용자 대기열에서 인수를 가져옵니다.

queue.get(timeout=10)# if nothing got then retry util get the arguments 
관련 문제