python - SQLite 테이블 조회, 조건 조회
기본적인 sqlite3 을 사용하기 위해서는 파이썬 프로그램에서 셋팅을 다음과 같이 한다.
import sqlite3
# DB 파일 조회 (없으면 새로 생성)
conn = sqlite3.connect('C:/Users/ifjiej/Desktop/python_basic/resource/database.db') # 본인 DB 경로
# 커서 바인딩
c = conn.cursor()
데이터 조회( 전체 )
c.execute("SELECT * FROM users")
SELECT * ' * ' 별표를 사용하면 전체 데이터를 조회할 수 있다. from 모듈 import *(모듈 내 전체 함수(객체) 사용)를 사용하는 방식과 비슷하다.
커서 위치가 변경되면서 데이터 테이블 열을 선택한다.
1개 로우 선택시,
print('One - > \n', c.fetchone())
첫번째 열의 데이터가 출력된다.
지정 로우 선택시, 1번 로우 이후 커서가 위치해 있으므로
2, 3, 4 로우가 선택되어 출력된다. 전체는 list 형태이고 각각의 인덱스 타입은 튜플로 출력된다.
print("Three -> \n", c.fetchmany(size=3))
전체 로우 선택시, 커서 위치는 4번 열 이후에 위치해 있어
all을 하더라도 테이블 내의 5번째 열 데이터만 출력된다.
print('ALL -> \n', c.fetchall())
이후,
print('ALL -> \n', c.fetchall())
을 하더라도 아무 데이터도 출력하지 않는다.
순회1
rows = c.fetchall()
for row in rows :
print("retrieve1 > ", row)
위 코드를 해석하면 변수 c 안의 테이블 데이터를 전체 list 형태 각각은 튜플로 저장된 형태로 rows 변수에 저장하고
이것은 iterator 이므로 for 문을 사용하여 row를 한라인씩 출력하면, 튜플로 쭉 데이터가 출력된다.
당연히 아래 형태들도 가능하다.
for row in c.fetchall() :
print("retrieve1 > ", row)
아래 코드는 SELECT 부터 c.fetchall() 까지 한번에 쿼리문으로 바로 처리하는 형태이다.
가독성이 떨어지므로 위의 코드가 자주 사용된다.
for row in c.execute('SELECT * FROM users ORDER BY id desc'):
print("retrieve1 > ", row)
WHERE 문
튜플형태
param1 = (3,)
c.execute('SELECT * FROM users WHERE id=?',param1)
print('param1',c.fetchone())
print('param1',c.fetchall()) # 3번 열 하나만 꺼내왔으므로 fetchall 하더라도 빈값으로 나옴
integer 형태 (정수)
param2 = 4
c.execute('SELECT * FROM users WHERE id="%s"'% param2)
print('param1',c.fetchone())
print('param1',c.fetchall()) # 데이터 없음
id="%s" id 값은 정수형태인데 숫자 integer 형태는 %s(string)를 사용할수도 있다. 원래는 %d다? 둘다 가능한거같다.
대체할 부분에 "%s"라고 적고, 문장이 끝나고 난 뒤에 "%대체할 말"을 적어서 의도한대로 문장을 출력하게 만들었습니다. 문자만 넣을 수 있는 것이 아니라 숫자(정수, 부동소수)도 넣을 수 있습니다.
dict (딕셔너리) 형태
c.execute('SELECT * FROM users WHERE id=:Id',{"Id": 5})
print('param3',c.fetchone())
print('param3',c.fetchall()) # 데이터 없음
OR 사용
c.execute("SELECT *FROM users WHERE id=:id1 OR id=:id2",{"id1":2,"id2":5})
print('param6',c.fetchall())
튜플 형태 (여러개)
IN 사용
param4 =(3,5)
c.execute("SELECT *FROM users WHERE id IN(?,?)", param4)
print('param4',c.fetchall())
정수 형태
c.execute("SELECT *FROM users WHERE id IN('%d','%d')"% (3,4))
print('param5',c.fetchall())
Dump 출력 ?
# Dump 출력
with conn:
with open('C:/Users/ifjiej/Desktop/python_basic/resource/dump.sql','w') as f :
for line in conn.iterdump():
f.write('%s\n' % line)
print("Dump Print Complete")
# f.close(), conn.close()
데이터베이스에 포함되어 있는 테이블 등의 정보를 SQL 문 형태로 출력하는 것을 덤프라고 한다. 덤프하게 되면 테이블 구조와 테이블에 저장되어 있는 하나 하나의 데이터에 대해 SQL 문 형태로 출력된다.
for line in conn.iterdump()
dump 는 주로 백업을 할 때 사용된다. " Dump 뜨다" 라고 하면 컴퓨터에 있는 SQL 파일을
dump로 SQL문으로 python에 저장하고 select 부터 커밋까지 된 dump파일을 다른 SQL 새 테이블에 집어넣을 때 새로운 파싱없이 바로 넣을 수 있다. 이를 dump라고 한다.