Skip to content

배토의 개발일지

나를위한 단편적 기억들의 기록

Menu
  • 안드로이드
  • 코틀린
  • Godot
  • 블렌더
  • git
  • 게임제작일지
  • 기타
Menu

Python sql basic sample source

Posted on 2020년 3월 11일2020년 4월 16일 by batmask

너무 오랫만에 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’를 사용한다.

튜토리얼 식으로 정리할 여력은 없고, 테스트 했던 코드나 올려본다.

답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최신 글

  • Blender : snap을 써서 다른 vertex에 정렬하기
  • KTor Client 기본 사용 정리
  • 게임 만들거다.
  • Using Koin with Android Compose

보관함

2020 3월
일 월 화 수 목 금 토
1234567
891011121314
15161718192021
22232425262728
293031  
« 8월   4월 »

메타

  • 로그인
  • 엔트리 피드
  • 댓글 피드
  • WordPress.org
©2025 배토의 개발일지 | Built using WordPress and Responsive Blogily theme by Superb