좋아, 나는 파이썬에 익숙하지 않다.
다음 Python 코드가 있습니다.
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
여기서는 var1정수이고 var2& var3는 문자열입니다.
쿼리 텍스트의 일부로 포함하는 파이썬없이 변수 이름을 어떻게 쓸 수 있습니까?
좋아, 나는 파이썬에 익숙하지 않다.
다음 Python 코드가 있습니다.
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
여기서는 var1정수이고 var2& var3는 문자열입니다.
쿼리 텍스트의 일부로 포함하는 파이썬없이 변수 이름을 어떻게 쓸 수 있습니까?
답변:
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
매개 변수는 튜플로 전달됩니다.
데이터베이스 API는 변수의 적절한 이스케이프 및 인용을 수행합니다. 문자열 형식화 연산자 ( %) 를 사용하지 않도록주의하십시오.
%입니다. 사실 저는 대답에서 그렇게 말합니다.
% 대신에 ,.. 여러 가지 이유로 내 투표를 취소 할 수 없다고 생각했습니다. 't 사용 %..
% 연산자 를 사용하여 문자열을 형식화 하지 마십시오 . 이러한 %문자열은 사용중인 cursor.execute직접, 그리고 그것의 생성 SQL을 알고 있기 때문에 당신을 보호하기 위해 더 많은 일을 할 수 있습니다.
Python DB-API의 다양한 구현은 다른 자리 표시자를 사용할 수 있으므로 사용중인 자리 표시자를 찾아야합니다 (예 : MySQLdb 사용).
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
또는 (예 : Python 표준 라이브러리의 sqlite3 사용) :
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
또는 아직 다른 것 ( 또는 "이름이 지정된 스타일"을 VALUES가질 수 있거나 에 대한 두 번째 인수로지도 대신 dict를 전달하는 위치 ). 사용중인 DB API 모듈에서 문자열 상수를 확인하고 http://www.python.org/dev/peps/pep-0249/ 에서 paramstyle을 찾아 모든 매개 변수 전달 스타일이 무엇인지 확인하십시오!(:1, :2, :3)(:fee, :fie, :fo)(%(fee)s, %(fie)s, %(fo)s)executeparamstyle
여러 가지 방법이 있습니다. NOT DO (가장 눈에 띄는 하나를 사용 %s와 %실제 코드를), 그것은 개방의 공격 .
여기 sqlite3의 pydoc에서 복사하여 붙여 넣습니다 .
# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()
# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
('2006-04-06', 'SELL', 'IBM', 500, 53.00),
]
c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
필요한 경우 더 많은 예 :
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
http://www.amk.ca/python/writing/DB-API.html
단순히 변수 값을 문장에 추가 할 때주의하십시오. 사용자가 자신의 이름을 지정한다고 상상해보십시오. ';DROP TABLE Users;'그렇기 때문에 적절한 방식으로 cursor.execute를 사용할 때 Python이 제공하는 SQL 이스케이프를 사용해야합니다. URL의 예는 다음과 같습니다.
cursor.execute("insert into Attendees values (?, ?, ?)", (name,
seminar, paid) )