2012-09-06 3 views
3

그래서 나는 배열 데이터를 파이썬으로 가지고 있습니다. 음, 오히려 목록 목록이 있습니다. 이 배열을 MySQL 데이터베이스의 단일 셀에 저장하려고합니다. JSON을 사용하여 데이터를 직렬화하려고 시도했지만 JSON의 작동 방식을 이해하지 못했을 수 있습니다.Python 목록 (JSON 또는 기타)을 MySQL 데이터베이스에 삽입하십시오.

그래서 내 데이터베이스에 연결 한 후 (내가

cur = con.cursor() 
cur.execute("CREATE TABLE IF NOT EXISTS 963168MBV17A(Id INT AUTO_INCREMENT PRIMARY KEY, Rev INT, Part VARCHAR(15), SN INT(7), Date DATE, Time TIME, Iterations INT(3), Upstream LONGBLOB, Downstream LONGBLOB, ResultList LONGTEXT, Result CHAR(1), Report LONGBLOB)") 

내가 upstream_data 및 downstream_data라는 목록 내 목록을 가지고 할 업스트림에 대한 LONGTEXT 및 LONGBLOB 데이터 유형을 시도하고 다운 스트림했습니다

export_upstream = json.dumps(upstream_data) 
export_downstream = json.dumps(downstream_data) 

그런 다음 SQL 명령을 실행합니다.

cur = con.cursor()  
sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES('503', '100-120970-0031', '1594539', '%s', '%s', '%s', '%s', '%s', 0, P, 0" %(export_date, export_time, export_numtests, export_upstream, export_downstream) 
cur.execute(sql_input) 

export_upstream = json.dumps(json.dumps(upstream_data)) 
export_downstream = json.dumps(json.dumps(downstream_data)) 

을하지만 상관없이 나는 오류와 끝까지 : Mordi (http://stackoverflow.com/questions/4251124/inserting-json-into-mysql-using-python)에 의해 R, 나는 시도조차

또한
Traceback (most recent call last): 
    File "P:\Projects\testing database\scrap\test.py", line 83, in <module> 
    cur.execute(sql_input) 
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1") 

, 나는

print "about to execute(%s)" % sql_input 

내가 JSON 개체가 목록 (사방에 작은 따옴표의 많은 긴 문자열로 나타나는 것을보고,에 외부에 수행 할 때 문자열을 나타냄). json.dumps (json.dumps (upstream_data))를 수행하면 안쪽 인용 부호가 큰 따옴표가되고 \ 앞에 문자가옵니다. 그래도 그래도 같은 오류가 발생합니다.

아이디어가 있으십니까? 그렇지 않다면 파이썬 배열 /리스트 데이터를 단일 MySQL 셀에 저장하는 더 좋은 방법이 있을까요?

출력 here

답변

1

당신이 그런 당신의 매개 변수를 대체 할 경우, 당신은 그냥 incrorrect 형태로 DB의 API를 호출, 당신은 당신의 데이터에 자신을 따옴표와 큰 따옴표를 이스케이프에 대한 책임 것입니다. 그 또한 SQL 인젝션의 위험한 공격을 허용하는 제공 할 수 있습니다뿐만 아니라

당신은 오류 당신이 가진 (그리고 그것에 대해 당신이 운이)됩니다 tehe.

데이터베이스에 대한 파이썬의 API는 이러한 공격의 가능성을 피하기 위해 처음부터 다시 설계되었으며, cursor.execute을 호출하면 문자열 대체가 수행됩니다. 그런 다음 필요한 이스케이프 문자열을 문자열에 추가합니다. 그래서, 대신 일을 : 당신이 자동 생성 된 파일에 소스 파일에 모든 미친 하드 코딩 된 숫자를해야하고, 그렇지 않으면

sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES('503', '100-120970-0031', '1594539', '%s', '%s', '%s', '%s', '%s', 0, P, 0" %(export_date, export_time, export_numtests, export_upstream, export_downstream) 
cur.execute(sql_input) 

나는,

sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES(%s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s" 
cur.execute(sql_input, [503, '100-120970-0031', '1594539', export_date, export_time, export_numtests, export_upstream, export_downstream, 0, "P", 0]) 

--Still를 수행 프로젝트가 어쨌든 실패 할 운명이라고 말하십시오. 난 당신의 코드를 참조

+0

가 마법처럼 일했다, 감사 – sirgogo

0

나는 문제가 SQL 명령, 또는 오히려 같은 부족을 탈출로 인해 기대합니다.

절대로, 이제까지 이것을 해보십시오. 당신이 (당신은 왜 모르는 경우 "리틀 조니 테이블"을 찾아 볼)가 사용자의 입력을 전달하는 경우 당신이보고있는 문제에서 별도로

cursor.execute("INSERT INTO whatever VALUES (%s)" % "foo") 

, 그것은 안전입니다.

cursor.execute("INSERT INTO whatever VALUES (%s)", ["foo"]) 

을 그리고 이스케이프 종류의 밖으로 MySQL의 인터페이스를하자 대신

, 이렇게.

6

MySQL 라이브러리가 매개 변수 처리를 수행하도록해야합니다.

cur = con.cursor()  
sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES('503', '100-120970-0031', '1594539', ?, ?, ?, ?, ?, 0, P, 0" 
cur.execute(sql_input, (export_date, export_time, export_numtests, export_upstream, export_downstream)) 

가 매개 변수화 SQL에 (일부) 자세한 내용은 Python DB API 2.0 spec를 참조하십시오 :이 빨리 너무 반복 삽입, MySQL은 당신의 문을 준비시키는 만들기의 추가 혜택을했다. 지원되는 정확한 매개 변수 형식은 데이터베이스 어댑터별로 문서화되어 있으므로 확인하십시오.

sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES('503', '100-120970-0031', '1594539', %s, %s, %s, %s, %s, 0, P, 0" 

다른 가능한 파라미터 옵션 (등 :1, :2) 숫자, 이름 (:foo, :bar) 파이썬의 다른 형태 다음 MySQLdb 모듈, 예를 들면, 모방 파이썬 문자열 포맷 구문 및 자리로서 %s 사용 문자열 형식 지정, 명명 된 형식 지정자 : (%(foo)s, %(bar)s).

+0

감사 남자. 나는 다른 사람들이 실행 명령을 실행하는 동안 전달하는 동안 sql_input에 삽입 된 일부 매개 변수를 가진 것은 나를 위해 형식 오류의 결과 때문에 허용 하나 jsbueno의 답변을 선택 (형식 오류 :하지 문자열 포맷 중에 변환 모든 인수). 그러나 다시 한번, 감사합니다, 확실히 올바른 방향으로 나를 가리켰습니다. 매개 변수의 수와 전달 된 값 사이에 불일치 같은 소리 – sirgogo

+0

가. –

1

첫 번째 문제는 이것이다 :

sql_input = "INSERT INTO table (column) VALUES('%s');" % (data) 

당신은 그렇게해서는 안 - SQL 삽입 또는 잘못된 SQL에서 당신을 보호하지 않습니다 당신이 사용하고 문자열 보간. 별도로 성명과 가치를 전달

sql = "INSERT INTO table (column) VALUES(%s);" 
values = (data,) 
cur.execute(sql,values) 

참고 :

대부분의 파이썬 DB API는이 유사한 자리 구문을 사용합니다. API는 이스케이프 및 서식을 처리합니다. 그게 가장 큰 문제이며, 아마 다른 모든 문제의 원인 -

sql = "INSERT INTO table (column) VALUES(%(id)s);" 
values = { 'id': 1) 
cur.execute(sql,values) 

제대로 데이터베이스 API를 사용하는 방법에 대한 최대 읽기 :

일부는뿐만 아니라 dicts이 가능합니다. 당신이 시도 할 수

1

한 가지 SQLAlchemy의의 SQL expression generation 당신을 위해 모든 이스케이프 등을 처리하는 사용하는 것입니다, 플러스 당신이 (적어도 SQL 데이터베이스와 같은에 삽입의 측면에서) 많은 보안 취약점을 취급하지 않도록 할 수 있습니다. 당신이하려는 것처럼 인라인 문자열 보간을하는 것과 대조적으로 쿼리를 매개 변수화합니다. 전혀 도움이

관련 문제