2016-10-20 2 views
0

python 용 mysql 커넥터를 사용하여 SQL 테이블의 단일 셀에서 단일 값을 업데이트하려고합니다. 다음 코드를 사용하면 오류 메시지가 나타나지 않지만 테이블이 실제로 업데이트되지 않습니다. 내가 업데이트하려고 시도하는 셀의 값은 때로는 비어 있고 때로는 NULL이며 때로는 문자열을 포함합니다. 여기 내 코드 :mysql 파이썬 모듈을 사용하여 SQL 테이블 업데이트

query = ("UPDATE data_set SET %s = '%s' WHERE id = %s") % (column_to_change, change_to_value, row_id) 

내가 뭘 잘못하고 있니?

편집 : 지금까지 답장 해 주셔서 감사합니다. 다른 쿼리로 비슷한 코드를 실행하는 데 효과적 이었기 때문에 주변 코드에 대한 기능적 문제 (SQL 주입 취약점에 대한 취약성 제외, 여기와 다른 곳에서)가 있다고 생각하지 않습니다. 이제 내 코드는 다음과 같습니다.

column_to_change = "column2" 
change_to_value = "james" 
id = "1234" 


cnx = mysql.connector.connect(user='user', password='password', 
          host='db.website.com', 
          database='database') 
cursor = cnx.cursor() 

query = ("UPDATE data_set SET %s = %s WHERE policy_key = %s") 

cursor.execute(query, (column_to_change, change_to_value, id)) 

cursor.close() 
cnx.close() 

관련성이있는 경우 삽입하려는 셀이 VARCHAR (45)로 포맷되어 있습니다. 셀에 SELECT 쿼리를 실행하면 다음과 같은 형식의 이름이 반환됩니다. (u'James ',)

change_to_value = "(u'James',)"로 설정하면 다음과 같은 오류 메시지가 나타납니다.

mysql.connector.errors.ProgrammingError : 1064 (42000) : SQL 구문에 오류가 있습니다. 'column1'= '(u \'James \ ',)'근처에서 사용할 올바른 구문을 보려면 MariaDB 서버 버전에 해당하는 매뉴얼을 확인하십시오. WHERE id = '1234'at 1 행

+0

here를 참조하십시오! 또한'commit()'을 호출 했습니까? – mata

+0

아니요, commit()을 호출하지 않았지만 방금 추가 했으므로 편집시 설명한 것과 같은 오류가 표시됩니다. –

+0

쿼리 매개 변수에 매개 변수를 사용해야 할 때 식별자 (테이블 이름, 열 이름)에 매개 변수를 사용하지 않고 다른 따옴표 문자 (백틱)를 사용하므로 SQL 구문 오류가 발생합니다. – mata

답변

0

모든 단계를 다음과 같습니다

conn = pyodbc.connect("SERVER=my.server;DATABASE=my_database;UID=my_user;PWD=my_password;",ansi=True) 

cursor = conn.cursor() 

query = ("UPDATE data_set SET %s = '%s' WHERE id = %s") % (column_to_change, change_to_value, row_id) 

cursor.execute(query) 

을 또한 파이썬의 버전에 따라 데이터베이스

0

에서 실행하려는 것과 .execute()로 통과가 동일한 SQL 쿼리를 확인, 아마도 그것은이다 문자열 보간 문제. 그렇지 않으면 커서를 연결하고 쿼리를 성공적으로 실행하지 못할 수 있습니다. 나는 당신이 당신의 코드에서 다른 곳 쿼리를 실행하는 가정입니다,하지만 당신이하지 않은 경우,이 작동합니다 : 당신이했던 것처럼 또는

cursor.execute (""" 
    UPDATE data_set 
    SET %s=%s 
    WHERE id=%s 
""", (column_to_change, change_to_value, row_id)) 

, 당신은 변수에이 쿼리를 저장할 수, 각각에 할당 변수는과 같이 나중에 실행하고 :

query = (“UPDATE data_set SET %s=%s WHERE id=%s”) 

column_to_change = [YOUR ASSIGNMENT HERE] 
change_to_value = [YOUR ASSIGNMENT HERE--if this is a string, it should be formatted as such here] 
row_id = [YOUR ASSIGNMENT HERE] 

cursor.execute(query, (column_to_change, change_to_value, row_id)) 

기본 문자열 보간 SQL 주입하는 경향이있다 피해야한다. 더 참고로

는, 당신은 문자열 서식을 사용하여 작성 사용자 매개 변수화 된 쿼리 및 안

+0

열 이름에 대해 작동하지 않는 열 이름은 작은 따옴표가 아니라 따옴표 문자로 백틱을 사용합니다. – mata