[패스트캠퍼스python] 데이터베이스 연동(SQLite)
파이썬 인강 : 데이터베이스 연동(SQLite)
1. 커서의 위치
데이터베이스는 커서의 위치가 중요하다
데이터를 불러오고 난 다음에 커서는 해당 데이터 뒤에 위치하기때문이다
1 | # 1개 로우 선택 |
위의 명령어를 활용한 예시는 아래 이미지와 같다
터미널에서 볼 수 있듯이 1개 로우 명령어 뒤라서 커서는 1번 로우를 지난 2번로우 앞에 있다
그리고 size=3인 로우를 출력하니 2,3,4번 로우가 터미널에 출력되었음을 알 수 있다
위의 상태에서 전체 로우 print(‘All -> \n’, c.fetchall()) 명령어를 입력하면 어떻게 될까?
커서는 지금 4번로우 뒤에 위치해있기때문에 마지막 로우인 5번 데이터만 출력된다
만약 위의 상태에서 print(‘All -> \n’, c.fetchall())를 한번 더 호출하면 어떻게 될까?
커서의 위치는 마지막 로우인 5번 뒤에 있다. 따라서 호출해도 [] 빈리스트만 터미널에 출력된다.
그렇다면 처음 1번 로우를 호출하고 싶을때는 어떻게 할 수 있을까?
바로 순회하면 된다
2. 순회
순회에는 3가지방법이 있다.
순회 : 변수선언 후 for in 반복문 사용
데이터조회 명령어 c.execute(‘SELECT * FROM users’) 뒤에 실행해야 출력된다1
2
3rows = c.fetchall()
for row in rows:
print('retrieve1 >', row) # 조회 없음순회 : 변수선언 없이 for in 반복문 바로 사용
데이터조회 명령어 c.execute(‘SELECT * FROM users’) 뒤에 실행해야 출력된다
간편하기때문에 제일많이 사용된다1
2for row in c.fetchall():
print('retrieve2 >', row) # 조회 없음순회
execute(“SELECT * FROM users)는 users에 있는 전체 데이터를 조회하는 명령어이다 따라서 fetchall() 명령어와 동일한 결과값을 가진다.
데이터조회 명령어 c.execute(‘SELECT * FROM users’) 까지 포함된 명령어로 데이터조회명령어가 따로 필요없다
코드가 길어져서 가독성이 떨어지는 지는 단점이 있다.
“ORDER BY id desc” 명령어를 넣어주면 역순출력이 된다1
2for row in c.execute("SELECT * FROM users ORDER BY id desc"):
print('retrieve3 > ', row)
순회1번과 순회2번은 함께 쓰일수없기때문에
순회2번과 순회3번의 출력값을 아래 이미지와 같다
3. WHERE Retrieve
6가지 방법이 있고 핵심이므로 꼭 다 알고 있어야한다.
WHERE Retrieve1
튜플형태로 3번로우인 Lee를 출력
fetchone()에서 3번 로우 하나만 불러왔기때문에 그 다음 명령어로 fetchall()로 전체를 불러와도 [] 빈 리스트만 출력된다1
2
3
4param1 = (3,)
c.execute('SELECT * FROM users WHERE id=?', param1)
print('param1', c.fetchone())
print('param1', c.fetchall())WHERE Retrieve2
튜플형태로 1번로우인 Kim을 출력
%s :문자열형, %d:정수형, %f: 실수형
fetchone()에서 1번 로우 하나만 불러왔기때문에 그 다음 명령어로 fetchall()로 전체를 불러와도 [] 빈 리스트만 출력된다1
2
3
4param2 = 1
c.execute("SELECT * FROM users WHERE id='%s'" % param2)
print('param2', c.fetchone())
print('param2', c.fetchall())WHERE Retrieve3
이번엔 딕셔너리형태로 1번 로우출력
id= 뒤에:Id
를 넣어준뒤 컴마찍고 딕셔너리형태로 {“Id”: 1} 첫번째로우를 호출하면 된다1
2
3c.execute("SELECT * FROM users WHERE id= :Id", {"Id": 1})
print('param3', c.fetchone())
print('param3', c.fetchall())WHERE Retrieve4
리스트형태로 파라미터 2개를 받아서 1번로우와 4번로우 출력
파라미터 여러가지를 가져오려면 IN(?,?)로 넣으면 된다
이젠 한개가 아니니까 fetchone()은 쓸 수 없고 fetchall()로 출력하면 된다1
2
3param4 = (1, 4)
c.execute('SELECT * FROM users WHERE id IN(?,?)', param4)
print('param4', c.fetchall())WHERE Retrieve5
위와 똑같은 결과값이지만 다르게 표현할 수 있다 물음표대신 정수값($d)을 넣어주면 된다
간단하기때문에 많이 사용한다1
2c.execute("SELECT * FROM users WHERE id In('%d','%d')" % (1, 4))
print('param5', c.fetchall())WHERE Retrieve6
딕셔너리형태로 1번과 4번로우 출력
OR 사용1
2c.execute("SELECT * FROM users WHERE id= :id1 OR id= :id2", {"id1": 1, "id2": 4})
print('param6', c.fetchall())
지금까지 id를 이용했지만 username, date등을 이용해서도 출력할수있다
4. Dump 출력
데이터베이스 백업 시 중요하다
아래 명령어를 실행하면 새로운 dump.sql이라는 파일이 형성되고 그 안에 작성한 데이터테이블이 백업된다.
이를 활용하여 sql에 붙여넣으면 다른 컴퓨터나 환경에서도 데이터사용가능하다
실무에서 흔히 ‘덤프떠와’ 라고 말한다.
with문을 사용하면 자동으로 close()를 해줘서 편리하다
- with open() as f: 를 실행했으므로 f.close()가 자동으로 되었고
- with conn: 을 실행했으므로 conn.close()가 자동으로 되었다
1 | with conn: |
위의 코드를 실행시키면 출력값은 아래 이미지와 같다.