너무 오랫만에 SQL 사용하려니 하나도 기억이 나질 않았다. 안드로이드나 싱글 어플리케이션에서 많이 쓰이는 sqlite3와 mySQL 호환 DB인 mariaDB를 설치해서 가장 간단한 동작들을 테스트해 봤다. 테이블 생성, 레코드 추가(INSERT), 읽기(SELECT), 수정(UPDATE), 삭제(DELETE).
간단한 구문들은 sqlite3와 mySQL 구분없이 사용할 줄 알았는데, 미묘하게 달라 살짝 당황했다. 예로 sqlite3에서 AUTOINCREMENT 가 mySQL에선 AUTO_INCREMENT로 쓰고, PRIMARY KEY도 sqlite3는 항목에 명시해 주는데, mySQL에선 별도로 표시해준다.
파이썬으로 Database쓰면서 가장 주의해야 할 점은 SQL Injection 공격에 대해 취약하지 않게 사용해야한다는 점이다. SQL문이 텍스트 구문이다보니, Python내에서 임의로 스트링을 조합해서 쓰는 경우가 있는데, 누군가 악의적으로 ‘DROP TABLE’같은 구문을 끼워넣으면 데이터가 날라가는등의 큰 문제가 될 수 있다. 해결책은 파라미터를 이용해 SQL문을 실행하는 것이다.
# sqlite3
cursor.execute(
"INSERT INTO likes (user_id, post_id)
VALUES (?, ?);", (3, 6))
# mySQL
cursor.execute(
"INSERT INTO likes (user_id, post_id)
VALUES (%s, %s);", (3, 6))
위의 코드처럼 Python에서 SQL문은 cursor를 얻어와 execute()로 실행하게 되는데, 그 인자를 파라미터(%s)로 사용하고 거기에 대응하는 값을 Tuple로 넘기는 식이다. 이렇게하면 SQL Injection 공격에 안전하다고 한다. 주의할점은 sqlite3에서는 파라미터 표시로 ‘?’를 사용하고, mySQL에서는 ‘%s’를 사용한다.
튜토리얼 식으로 정리할 여력은 없고, 테스트 했던 코드나 올려본다.