python

python - SQLite 테이블 조회, 조건 조회

myfreetime 2020. 4. 29. 17:03

기본적인 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라고 한다.