안경잡이개발자

728x90
반응형

  파이썬의 경우 sqlite3표준 라이브러리로 제공하고 있다. 그래서 파이썬을 설치했다면, 별다른 추가 설치 없이 sqlite3을 이용할 수 있다. sqlite3은 다음과 같이 불러 올 수 있다. 참고로 아래 소스코드를 실행하면 '3.21.0'와 같은 SQLite의 버전명이 출력된다. 이것은 파이썬 라이브러리 버전은 아니고, SQLite의 버전으로 이해할 수 있다.

 

import sqlite3


print(sqlite3.sqlite_version)

 

※ 데이터베이스 생성 ※  

 

  데이터베이스를 생성할 때는 간단히 connect() 메서드를 사용하면 된다. 이때 메서드의 인자로 넣은 값이 데이터베이스 파일의 경로가 된다. 예를 들어 'my_database.db'라는 파일을 생성하고자 한다면 다음과 같이 한다. 현재 'my_database.db'라는 데이터베이스 파일이 없기 때문에, 새롭게 생성된 것을 확인할 수 있다.

 

 

※ 테이블 생성 ※

 

  SQL 구문을 이용하기 위해서는 cursor 객체가 필요하다. cursor 객체를 이용하여 실제로 데이터베이스에 테이블(table)을 삽입하거나, 테이블(table)을 조회할 수 있다. 예를 들어 다음의 명령어는 Course(과목)라는 이름의 테이블을 생성한다. 이후에 생성된 테이블 정보를 조회한다.

 

import sqlite3


con = sqlite3.connect('./my_database.db')

cursor = con.cursor()

SQL = "CREATE TABLE Course (Course_ID int primary key not null, Course_Name text, Course_Date date);"
cursor.execute(SQL)

SQL = "SELECT name FROM sqlite_master WHERE type='table';"
cursor.execute(SQL)
print(cursor.fetchall())

SQL = "SELECT sql FROM sqlite_master WHERE type='table';"
cursor.execute(SQL)
print(cursor.fetchall())

con.close()

 

  실행 결과는 다음과 같다.

 

[('Course',)]
[('CREATE TABLE Course (Course_ID int primary key not null, Course_Name text, Course_Date date)',)]

 

※ 데이터 삽입 ※

 

  데이터를 삽입할 때는 INSERT 구문을 사용한다. 참고로 데이터를 삽입(insert)하는 명령어를 실행한 뒤에 데이터베이스에 반영하기 위해 commit() 메서드를 호출해야 한다.

 

import sqlite3


con = sqlite3.connect('./my_database.db')

cursor = con.cursor()

SQL = "INSERT INTO Course VALUES(1, 'Algorithm', '2021-03-01');"
cursor.execute(SQL)
SQL = "INSERT INTO Course VALUES(2, 'Data Structure', '2021-03-02');"
cursor.execute(SQL)
SQL = "INSERT INTO Course VALUES(3, 'Computer Architecture', '2021-03-05');"
cursor.execute(SQL)
con.commit()

SQL = "SELECT * FROM Course;"
cursor.execute(SQL)
print(cursor.fetchall())

con.close()

 

  실행 결과는 다음과 같다.

 

[(1, 'Algorithm', '2021-03-01'), (2, 'Data Structure', '2021-03-02'), (3, 'Computer Architecture', '2021-03-05')]

 

※ 데이터 삭제 ※

 

  데이터 삭제는 DELETE 구문을 사용하면 된다. 예를 들어 Course 테이블에 있는 모든 데이터(row)를 삭제하기 위해서는 다음과 같이 하면 된다. INSERT 구문과 마찬가지로 실행 뒤에 commit() 메서드를 이용해 DB에 반영할 수 있다. 위 코드를 실행하면 Course 테이블에 존재하는 모든 데이터가 삭제되기 때문에, 조회 결과가 없다.

 

import sqlite3


con = sqlite3.connect('./my_database.db')

cursor = con.cursor()

SQL = "DELETE FROM Course;"
cursor.execute(SQL)
con.commit()

SQL = "SELECT * FROM Course;"
cursor.execute(SQL)
print(cursor.fetchall())

con.close()

 

 

※ 하나의 테이블로 구성되는 간단한 데이터베이스 연동 프로그램 예시 ※

 

  파이썬에서 SQLite 3 문법을 활용한 간단한 데이터베이스 연동 프로그램은 다음과 같다.

 

import sqlite3

database_name = './my_database.db'

con = sqlite3.connect(database_name)
cursor = con.cursor()
SQL = "CREATE TABLE IF NOT EXISTS Course (Course_ID int primary key not null, Course_Name text, Course_Date date);"
cursor.execute(SQL)
con.close()


def insert_course(course_id, course_name, course_date):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "INSERT INTO Course VALUES(?, ?, ?);"
    cursor.execute(SQL, (course_id, course_name, course_date))

    con.commit()
    con.close()


def insert_course_list(course_list):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "INSERT INTO Course VALUES(?, ?, ?);"
    cursor.executemany(SQL, course_list)

    con.commit()
    con.close()


def search_course_by_name(course_name):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "SELECT * FROM Course WHERE course_name = ?;"
    cursor.execute(SQL, (course_name, ))

    return cursor.fetchall()


def search_course():
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "SELECT * FROM Course;"
    cursor.execute(SQL)

    return cursor.fetchall()


def search_course_order_by_date(limit):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "SELECT * FROM Course ORDER BY date(course_date) ASC Limit ?;"
    cursor.execute(SQL, (limit, ))

    return cursor.fetchall()


def update_course_by_id(course_id, course_name, course_date):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "UPDATE Course SET course_name = ?, course_date = ? WHERE course_id = ?;"
    cursor.execute(SQL, (course_name, course_date, course_id))

    con.commit()
    con.close()


def delete_course_by_id(course_id):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "DELETE FROM Course WHERE course_id = ?;"
    cursor.execute(SQL, (course_id, ))

    con.commit()
    con.close()


delete_course_by_id(1)
delete_course_by_id(2)
delete_course_by_id(3)
delete_course_by_id(4)
delete_course_by_id(5)
insert_course(1, 'Algorithm', '2021-03-01')
insert_course(2, 'Data Structure', '2021-03-02')
insert_course(3, 'Computer Architecture', '2021-03-05')
course_list = [
    (4, 'Programming Language', '2021-03-04'),
    (5, 'Compiler', '2021-03-01'),
]
insert_course_list(course_list)
print(search_course_by_name('Algorithm'))
update_course_by_id(1, 'Cyber Security', '2021-03-03')
print(search_course())
print(search_course_order_by_date(100))
print(search_course_order_by_date(100)[::-1])

 

  실행 결과는 다음과 같다.

 

[(1, 'Algorithm', '2021-03-01')]
[(1, 'Cyber Security', '2021-03-03'), (2, 'Data Structure', '2021-03-02'), (3, 'Computer Architecture', '2021-03-05'), (4, 'Programming Language', '2021-03-04'), (5, 'Compiler', '2021-03-01')]
[(5, 'Compiler', '2021-03-01'), (2, 'Data Structure', '2021-03-02'), (1, 'Cyber Security', '2021-03-03'), (4, 'Programming Language', '2021-03-04'), (3, 'Computer Architecture', '2021-03-05')]
[(3, 'Computer Architecture', '2021-03-05'), (4, 'Programming Language', '2021-03-04'), (1, 'Cyber Security', '2021-03-03'), (2, 'Data Structure', '2021-03-02'), (5, 'Compiler', '2021-03-01')]

 

※ 날짜 관련 코드 ※

 

  참고로 현재 시각과 같은 날짜 및 시간 데이터가 필요할 때는 다음의 코드를 활용할 수 있다.

 

import sqlite3

database_name = './my_database.db'


con = sqlite3.connect(database_name)
cursor = con.cursor()

# 세계표준시
SQL = "SELECT strftime('%Y-%m-%d %H:%M:%S', 'now');"
cursor.execute(SQL)
print(cursor.fetchall())

# 현지시간
SQL = "SELECT strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime');"
cursor.execute(SQL)
print(cursor.fetchall())

 

  실행 결과는 다음과 같은 형태를 갖는다.

 

[('2021-07-18 12:09:18',)]
[('2021-07-18 21:09:18',)]
728x90
반응형