2017-03-09 2 views
0

문자열 형식을 사용하여 문자열 배열에서 일부 문자열을 삽입하려고합니다.파이썬 문자열 형식 : 단일 인용 부호 문제

하지만 어떤 이유로 파이썬은 첫 번째 % s에 원하는 문자열을 채우지 만 작은 따옴표로 묶습니다.

이 동작을 방지하기위한 명시적인 방법이 있습니까?

예 :

cursor.executemany("INSERT INTO schema.myTable_%s_name (col1, col2, col3, col4, col5) VALUES (%s, NULLIF(%s,'None')::decimal, NULLIF(%s,'None')::decimal, %s, NULLIF(%s,'None')::int)", myString[0:len(myString)]) 

예상되는 동작은 테이블 이름 schema.myTable_000b_name이되고 있지만, 파이썬은 자연스럽게 실행에서 SQL을 방지 schema.myTable_'000b'_name를 기록한다는 것입니다 :

myString = [['000b', 
    '1', 
    'Text1', 
    '1.74', 
    'Text2', 
    'None'], 
['000b', 
    '1', 
    'TextA', 
    '12.92', 
    'TextB', 
    'None']] 

나는 다음과 같은 실행

. 작은 따옴표를 삽입하지 않으려면 어떻게 지정할 수 있습니까?

답변

1

귀하가 생각하는대로 작동하지 않습니다.

executemany 절차는 SQL 문을 생성 한 다음 동일한 문을 실행하여 다른 매개 변수에 바인딩합니다. 예를 들면 다음과 같이 할 수 있습니다. 테이블에 많은 행을 신속하게 삽입하십시오.

다른 서로 다른 SQL 문을 실행할 수 없으며 각 문에는 자체 매개 변수가 있습니다. 매개 변수에서 테이블 이름을 보간하는 것을 지원하지 않습니다. 일종의 일을 시도한 사실은 기능이 아니라 호기심입니다.

많은 테이블에 삽입해야하는 경우 많은 수의 insert 문을 실행하십시오. 일반적인 파이썬 보간법을 사용하여 테이블 이름을 계산합니다. DB 드라이버는 테이블 이름의 중간에있는 매개 변수를 varchar 상수로 해석하여 올바르게 인용합니다.

0

파이썬으로 SQL 문자열을 생성 할 때 파이썬의 문법은 .format(key=value)입니다. https://pyformat.info을 참조하십시오. 이것은 대단하고 직관적 인 쿼리 생성을 가능하게합니다.

my_array = [{table: 'something',value: 'something_else'}] 

for opts in my_array: 
    query = 'select * into {table} from some_table where x = {value}'.format(**opts) 
+0

이봐, 작은 바비 테이블이 호출되면 데이터베이스를 다시 원했습니다. 'opts = {'table ':'innocuous_table ','value ': '10; DROP DATABASE PROD; '}'. 또한 사전 리터럴은 Python이 아닌 JavaScript에서 가져온 것입니다. – 9000

+0

자바 스크립트 노트 주셔서 감사합니다, 너무 날카로운 아니 었어. 형식 지정은 내부적으로 항상 문제가되지 않으며 (my_array가 아니라 your_array가 호출 된 이후) 거의 모든 형식화 방법으로 동일하게 적용됩니다. – Roelant