2017-09-07 5 views
4

플라스크 및 패키지 flask-mysql을 사용하여 웹 사이트를 작성할 때 이상한 버그가 있습니다. 나는이 페이지에 네 개의 변수를 게시 할 때데이터 업데이트시 Flask-Mysql 유형 오류

@app.route('/calendar/editeventtitle',methods=['POST']) 
def editeventtitle(): 
    if not session.get('logged_in'): 
     abort(401) 

    try: 
     id = request.form.get('id',type=int) 
     title = request.form['title'] 
     color = request.form['color'] 
     delete = request.form.get('delete') 
    except: 
     pass 

    conn = mysql.connect() 
    cursor = conn.cursor() 
    print(id,type(id)) 
    # try: 
    # print(delete,type(delete)) 
    # except: 
    # pass 

    if id and delete: 
     cursor.execute('delete from events where id = %d',id) 
     conn.commit() 
     flash('Event canceled!') 
     return redirect(url_for('calendar')) 
    elif id and title and color: 
     cursor.execute('update events set title = %s, color = %s where id = %d',(title,color,id)) 
     conn.commit() 
     flash('Event updated!') 
     return redirect(url_for('calendar')) 

: 여기

버그 함수의 코드입니다. 나는 그들을 성공적으로 얻는다.

6 <class 'int'> 

우리는 정말 정수입니다 볼 수 있지만 코드를 업데이트하거나 DB에서 데이터를 삭제하기 시작할 때, 여기에 오류 메시지입니다 : : 그리고 print(id,type(id))의 결과는 같다

TypeError: %d format: a number is required, not str

정말 돈 그 이유를 알지 못해 - 누구든지 나를 도울 수 있니? 고맙습니다.

PS : Python3.6.1, 플라스크 0.12.2는 플라스크 - MySQL은 1.4.0

답변

3

당신은 당신이 다음과 같이 실행 SQL 쿼리의 모든 매개 변수에 대한 %s를 사용해야합니다. 그 이유는 flask-mysql (또는 그것이 의존하는 MySQL 파이썬 라이브러리가 무엇이든) 문자열 보간을하기 전에 문자열에주는 매개 변수 title, color, id을 변환하기 때문입니다.

쿼리에서 사용한 매개 변수가 integer, SQL identifier와 같은 예상되는 유형의 실제 매개 변수이며 쿼리를 중단시킬 수있는 SQL 코드가 아니라는 것도 검사하기 때문에 이러한 이유가 있습니다. (이것은 데이터베이스에 무단으로 액세스하는 데 사용되며 SQL 주입이라고합니다.) 각 값에 대해 형식을 검사하고이를 SQL 표현으로 변환하는 f}을 결정합니다.

이 이유 때문에 titlecolor 매개 변수를 작은 따옴표로 묶지 않아도됩니다. SQL 라이브러리는 매개 변수를 문자열로 식별하고 해당 문자열에 포함 된 작은 따옴표를 이스케이프 한 후에 따옴표를 추가합니다. 또한 여기에 datetime과 같은 Python 객체를 전달할 수있는 이유이기도합니다. 오브젝트는 대응하는 SQL 형태의 리터럴 표현에 올바르게 변환됩니다.