program story

Python의 SQL 문에서 변수를 사용하는 방법은 무엇입니까?

inputbox 2020. 10. 9. 11:09
반응형

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는 변수의 적절한 이스케이프 및 인용을 수행합니다. 문자열 형식화 연산자 ( %) 를 사용하지 않도록주의하십시오.

  1. 이스케이프 또는 인용을 수행하지 않습니다.
  2. 제어되지 않는 문자열 형식 공격 (예 : 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) )

참고 URL : https://stackoverflow.com/questions/902408/how-to-use-variables-in-sql-statement-in-python

반응형