본문 바로가기
프로그래밍/Python

파이썬 SQLite 데이터베이스를 사용해보자. (데이터 추가/수정/삭제/선택)

by _BlankSpace 2020. 2. 9.

아주 간단한 프로그램이라도 데이터를 저장하는 기능은 대부분 있어야 할 거에요. 그래야 전의 상황을 기록하고 사용자에게 제공할 수 있으니 말입니다.

저장하는 방법은 간단하게 파일에 데이터를 기록하는 방법도 있습니다. 다만, 체계적으로 데이터를 저장하려면 꽤 귀찮은 작업들이 필요하겠죠. 그래서 간단한 프로그램들을 위해 소규모에서 쉽게 사용할 수 있는 데이터베이스를 제공하기도 합니다.

이번 포스팅에서는 소규모 프로그램에서 자주 사용하는 SQLite를 사용하는 두번째 포스팅을 정리해보려 합니다. 여기에는 파이썬에서 SQLite를 이용하여 데이터를 추가, 수정, 삭제 그리고 조회하는 방법에 대해 정리할 것입니다. 테이블을 생성하고 삭제하는 방법이 궁금하신 분이라면 아래 포스팅을 확인해주세요.

[프로그래밍/Python] - 파이썬 SQLite 데이터베이스를 사용해보자. (create/drop)

불러오는 중입니다...

# 일단 기본적인 테이블을 만들자.

데이터베이스를 만들고, 그 안에서 테이블을 생성하는 방법은 위에 추가된 링크를 참고해주세요. 여기서는 별다른 설명 없이 테이블을 생성하도록 하겠습니다.

import sqlite3

con = sqlite3.connect("test.db") # "test.db" 파일을 데이터베이스로 연결하여 사용한다.
cur = con.cursor() # 데이터베이스를 동작시키기 위한 커서를 생성한다.
query = """create table TestData (
            no integer,
            title text,
            date date                
        )"""
cur.execute(query) # 쿼리 내용을 실행한다.
con.close() # 연결할 데이터베이스를 종료한다

아주 간단한 코드를 작성해봤습니다. 이제 생성한 테이블에 데이터를 넣어보도록 하겠습니다.

 

실행하면 아래와 같이 데이터가 들어간 것을 확인할 수 있습니다.

 

# 테이블에 데이터 추가(insert)하는 방법

테이블을 조작하는데 가장 기본적인 기능이라고 할 수 있는 데이터 추가입니다. 일단, 데이터베이스를 조금이라도 공부하신 분이라면 기본적인 데이터 삽입 명령을 아실거에요. 보통 아래와 같이 쿼리문을 작성할 수 있습니다.

insert into 테이블명 values (데이터명, 데이터명, ...)

 

그럼, 바로 위의 insert 쿼리문을 이용하여 데이터를 추가해볼까요?

# insert 예제
# 데이터를 추가하는 첫번째 방법
cur.execute("insert into TestData values (?, ?, ?)", (1, "data1", "2020-01-25"))
# 데이터를 추가하는 두번째 방법
query = "insert into TestData values (:no, :title, :title, :date)"
parameters = {
                "no":2,
                "title":"data2",
                "date":"2020-01-27"
}
cur.execute(query, parameters)
con.commit() # 해당 작업을 커밋하는 것을 말합니다. 즉, 데이터베이스에 관련 내용을 적용하겠다라른 뜻입니다.

위에서 데이터를 추가하는 방법으로 두가지를 예제로 적었습니다.

첫번째 방법은 데이터명을 직접 명시하지 않고, 순서대로 데이터를 추가하겠다는 뜻입니다. 이때는 ?의 개수만큼 데이터를 넣어줘야겠죠?

두번째 방법은 변수 하나가 여러 열에 들어가는 경우에 사용할 수 있는 방법입니다. 위와 같이 쿼리를 작성하면, title을 여러 곳에 넣어줘야 할 경우에도 parameters를 작성할 때는 한번만 적어줘도 된다는 장점이 있습니다.

쿼리문을 실행하려면 execute를 실행하고, 그 내용을 데이터베이스에 적용하려면 commit함수를 실행해야 합니다.

 

실행하면 아래와 같이 데이터가 들어간 것을 확인할 수 있습니다.

 

하지만 위와 같은 방식은 데이터를 하나씩 일일히 넣어야됩니다. 많은 사람들의 데이터를 관리해야 하는 프로그램이라면 굉장히 많은 작업을 일일히 넣어줘야 한다는 것이죠. 때문에 대량의 데이터를 리스트로 한번에 넣는 방법도 있습니다.

바로, executemany라는 함수입니다. 간단한 예제를 보겠습니다. 

query = "insert into TestData values (:no, :date, :title)"
dataList = []
for i in range(3, 6) :
    dataList += {"no":i, "title":"data" + str(i), "date":"2020-01-27"},
cur.executemany(query, dataList) # 대량의 데이터는 executemany함수로 쿼리를 실행한다.
con.commit()
con.close()

execute 대신에 executemany라는 함수를 이용하여 리스트에 있는 내용을 파라미터로 넣어준 것입니다.

 

실행하면 아래와 같이 데이터가 들어간 것을 확인할 수 있습니다.

 

 

# 테이블 데이터 조회(select)하는 방법

이제 테이블에 데이터를 추가해봤으니 제대로 들어갔는지 확인해봐야겠죠? 보통, 테이블에 데이터가 제대로 들어갔는지 확인하는 쿼리문은 다음과 같습니다.

select 필드명, 필드명... from 테이블명 where 데이터명 = ?

 

위와 같이 쿼리문만 보면 이해하기 힘들 수 있으므로 간단 예제를 보겠습니다.

아래 select문을 보면, * 가 보일텐데, 이것은 모든 필드를 가져오겠다는 말입니다. 즉, 이 예제에서는 "no", "title", "data" 필드를 다 가져오겠다는 말입니다. 그리고, where 뒤에는 조건절이 들어갑니다. 아래 예제에서는 date가 ?일 경우를 뜻하는데, 뒤에 "2020-01-27"인 데이터를 가져오겠다는 말입니다.

#insert data
query = "insert into TestData values (:no, :title, :date)"
dataList = []
for i in range(3, 6) :
    dataList += {"no":i, "title":"data" + str(i), "date":"2020-01-27"},
cur.executemany(query, dataList)
con.commit()

#select data
cur.execute("select * from TestData where date = ?", ("2020-01-27",))
print(cur.fetchone()) # 조회한 데이터 중 하나만 가져온다.
print(cur.fetchall()) # 조회한 데이터 모두를 가져온다.
con.close()

 

결과는 다음과 같습니다. fetchone()과 fetchall() 함수의 차이를 알 수 있겠죠?

(3, 'data3', '2020-01-27')
[(4, 'data4', '2020-01-27'), (5, 'data5', '2020-01-27')]

 

# 테이블 데이터 수정(update)하는 방법

다음으로는 데이터를 수정하는 방법에 대해서 알아보도록 하겠습니다. 보통 쿼리문으로는 update문이라고 할 수 있습니다. 즉, update는 where 절에서 필드명 중 찾는 데이터가 있으면, 수정할 데이터로 변경하겠다는 뜻입니다.

update 테이블명 set 필드명=수정할 데이터 where 필드명=찾는 데이터

 

코드가 점점 길어지는 것 같지만, 위에서 설명한 코드에서 추가되는 것이므로 부담 가지실 필요는 없습니다. 간단하게 업데이트 되는 부분만 보면 되겠습니다.

query = "insert into TestData values (:no, :title, :date)"
dataList = []
for i in range(3, 6) :
    dataList += {"no":i, "title":"data" + str(i), "date":"2020-01-27"},
cur.executemany(query, dataList)
con.commit()

# 업데이트 전 데이터를 가져온다.
cur.execute("select * from TestData where date = ?", ("2020-01-27",))
print(cur.fetchall())

# 데이터 업데이트.
query = "update TestData set title=:title where date=:date"
parameters = {
    "title":"newData",
    "date":"2020-01-27"
}
cur.execute(query, parameters)

# 업데이트 후 데이터를 가져온다.
cur.execute("select * from TestData")
print(cur.fetchall())
con.close()

 

결과는 다음과 같습니다. 예제를 보면, "update TestData set title=:title where date=:date" 를 이용해서 date가 2020-01-27인 데이터를 모두 가져와서 newData라는 title로 모두 변경하는 것입니다. 굉장히 간단하죠?

[(3, 'data3', '2020-01-27'), (4, 'data4', '2020-01-27'), (5, 'data5', '2020-01-27')]
[(3, 'newData', '2020-01-27'), (4, 'newData', '2020-01-27'), (5, 'newData', '2020-01-27')]

 

실행하면 아래와 같이 데이터가 들어간 것을 확인할 수 있습니다.

 

# 테이블 데이터 삭제(delete)하는 방법

마지막으로 테이블에서 데이터를 삭제하는 방법입니다. 당연히 데이터를 추가했다면 삭제도 할 수 있어야겠죠? 데이터를 삭제하는 쿼리문은 보통 다음과 같이 구성됩니다.

즉, 해당 테이블에서 아래와 같은 필드의 데이터를 찾아서 삭제한다는 뜻입니다.

delete from 테이블명 where 필드명=데이터

 

그럼, 바로 예제를 보도록 하겠습니다. 아래 예제는 테이블을 만들고, 데이터를 추가한 후에 data4를 title로 가진 데이터를 삭제하는 예제입니다. 굉장히 간단하죠?

import sqlite3

con = sqlite3.connect("test.db")
cur = con.cursor()
query = """create table TestData (
            no integer,
            title text,
            date date                
        )"""
cur.execute(query)

# 데이터 추가.
query = "insert into TestData values (:no, :title, :date)"
dataList = []
for i in range(3, 6) :
    dataList += {"no":i, "title":"data" + str(i), "date":"2020-01-27"},
cur.executemany(query, dataList)
con.commit()

# 데이터 삭제.
cur.execute("delete from TestData where title=?", ("data4",))
cur.execute("select * from TestData") # TestData 테이블의 모든 필드를 조회한다.
print(cur.fetchall()) # 조회한 데이터를 모두 출력한다.
con.commit()
con.close()

 

결과는 아래처럼 나옵니다. 위에 "data4" 라는 데이터를 제거했기 때문에 아래처럼 데이터는 두 개만 나오는 것을 확인할 수 있습니다.

[(3, 'data3', '2020-01-27'), (5, 'data5', '2020-01-27')]

 

실행하면 아래와 같이 데이터가 들어간 것을 확인할 수 있습니다.

 

이상으로 파이썬에서 SQLite를 사용하여 데이터 추가/조회/수정/삭제 하는 법에 대한 정리를 마치도록 하겠습니다. 잘못된 내용이나 이해가 안가시는 부분이 있다면 댓글 남겨주세요. :)

 

저의 글이 도움이 되었다면 공감 및 구독 버튼 한번씩 눌러주세요! :)

댓글