Python의 SQL 문에서 변수를 사용하는 방법은 무엇입니까?
좋아, 나는 파이썬에 익숙하지 않다.
다음 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는 변수의 적절한 이스케이프 및 인용을 수행합니다. 문자열 형식화 연산자 ( %
) 를 사용하지 않도록주의하십시오.
- 이스케이프 또는 인용을 수행하지 않습니다.
- 제어되지 않는 문자열 형식 공격 (예 : 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)
execute
paramstyle
여러 가지 방법이 있습니다. 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) )
참고 URL : https://stackoverflow.com/questions/902408/how-to-use-variables-in-sql-statement-in-python
'program story' 카테고리의 다른 글
신속한 3.0 데이터를 문자열로? (0) | 2020.10.09 |
---|---|
교차 엔트로피 란 무엇입니까? (0) | 2020.10.09 |
Windows 응용 프로그램에서 상대 경로를 절대 경로로 변환하는 방법은 무엇입니까? (0) | 2020.10.09 |
활동을 포 그라운드로 가져 오는 방법 (스택 맨 위)? (0) | 2020.10.09 |
Guice의 인젝터에서 주석이 달린 인스턴스를 검색하는 방법은 무엇입니까? (0) | 2020.10.09 |