2012-11-20 9 views
0

작은 문제가 있습니다. 그리고 나는 어리석은 일을하고 있지만 생각할 수 없다고 생각합니다.mysqldb.exeute의 문자열 교체 문제

첫 번째로 : 파이썬에서 mysql에 동적으로 생성 된 sql을 실행하고 싶습니다. 간단한 삽입 문이지만 값에 큰 따옴표 및 다른 특수 문자를 사용할 수 있습니다. 그래서, 어떻게해야할지 모르겠습니다. 나는 내가 열 이름과 같은 다른 방법이 없습니다이 함수에서 동적으로 생성 STMT 및 value_tuple을 통과해야 다음 코드

def fire_statement(stmt, value_tuple=None): 

    try: 
     if value_tuple == None: 
      cur.execute(stmt) 
      return True 
     else: 
      v = tuple(value_tuple)     
      cur.execute(stmt % v) 
      return True 
    except Exception, ex: 
     print ex 
     print "Query: '"+stmt+"'" 
     return False 

노력이에 따라 Stackoverflow

- 그럼 난이 스레드 건너왔다 값은 둘 다 외부 조건에 따라 달라집니다. 그리고 정보의 또 다른 부분은 전달 된 value_tuple은 원래 목록입니다.

두 조건이 코드에서 발생하고있다 작동

조건 1 접근법 없음 아아 : 때 value_tuple = ('269', '1', '69', '1096', '1' , '3070801'는 ) '6', '1963'BE '및 STMT = INSERT INTO XXX (NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR, CAT) VALUES (??? 이 오류가 발생합니다. 문자열 서식을 지정할 때 모든 인수가 변환되지 않습니다.

(분명히 cur.execute (stmt % v)는이 경우 cur.execute (stmt, v)로 변경됩니다. ('269', '1', '69', '1096', '1', '3070801', 'BE', '1963', '6') 및 stmt = INSERT INTO XXX (NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR, CAT) VALUES (%의 S %의 S %의 S %의 S %의 S %의 S %의 S %의 S % 들) 는이 오류를 던지고있다 - (1054) "알 수없는 열은 '필드 목록'에서 'BE'" 검색어 : 'INSERT INTO XXX (NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR,) VALUES (% s, % s, % s, % s, % s, % s, % s, % s, % s, % s) '

전혀 교체하지 않는 것 같습니다. 하지만 난 cur.execute 다음 결과로 표시 직전에 인쇄 (STMT의 %의 V)를 수행하는 경우 - INSERT INTO XXX (NCLASS, CRECEIVE, SUBCAT, GDATE, ASSCODE, PATENT, COUNTRY, GYEAR, CAT) VALUES (269 (1) , 69, 1096, 1, 3070801, BE, 1963, 6)

문자열 값을 따옴표로 묶지 않으므로 분명히 올바르지 않습니다. 그리고 이것이 이것이 오류의 원인 일 수 있다고 생각합니다. 이 때문에 나는 개발 사이클에서 몇 시간 동안 심하게 멈추었다.당신은

"INSERT INTO tab (col1, col2) VALUES (%s, %s)" 

이있는 경우

cur.execute(stmt, v) 

하지

cur.execute(stmt % v) 

를 사용하여 인수를 전달하려는 사전

답변

2

감사를 도와 두를 통과하십시오 현 %를 사용 ('val1', 'val2'), 그것은 될 것입니다 : 분명히 존재하지 않는 열 이름으로 해석됩니다

"INSERT INTO tab (col1, col2) VALUES (val1, val2)" 

.

당신은 그것을 실행 할 수 있기

cur.execute(stmt, v) 
이 이

"INSERT INTO tab (col1, col2) VALUES ('val1', 'val2')" 

으로 올바르게 해석됩니다

당신은 또한 올바른 형식의 쿼리를 볼 수

print cur.mogrify(stmt, v) 

를 사용한다면 귀하의 DB.

+0

감사합니다. 내 인생을 살았습니다. :) – SRC