안경잡이개발자

728x90
반응형

  금융인증센터(yessign)에서는 공동인증서(공인인증서)와 관련한 다양한 기능을 제공한다. 대표적으로 공인인증서(공동인증서)의 상세 내용을 확인할 수 있고, 암호를 변경하거나, 공인인증서를 파일로 내보내기할 수 있다. 인증서 관리 페이지는 다음의 경로에서 확인할 수 있다.

 

  ▶ 금융인증센터(yessign) 인증서 관리 페이지

 

yessign 홈페이지 - 인증서 정보관리

 

www.yessign.or.kr

 

※ 인증서 내용보기 ※

 

  페이지에 접속하면 다음과 같이 인증서를 관리할 수 있는 다양한 기능이 존재한다. 여기에서 [인증서 내용보기] 기능을 이용해보자.

 

 

  이후에 인증서 목록이 나온다. 만약 자신이 원하는 인증서의 상세 내용을 확인하고 싶다면, 다음과 같이 [인증서 보기] 버튼을 누르면 된다.

 

 

  이후에 [자세히] 버튼을 누르면, 해당 인증서의 소유자가 누구인지, 어떤 은행(혹은 증권) 사이트에서 공동인증서(공인인증서)를 발급받았는지 확인할 수 있다. 아래 인증서는 키움증권에서 발급받은 것을 알 수 있다.

 

 

※ 인증서를 갱신하고 싶다면? ※

 

  인증서를 일반적으로 유효기간이 1년이기 때문에, 가지고 있는 인증서의 유효기간을 갱신하기 위해서는 [인증서 갱신]을 진행해야 한다.

 

 

  그래서 인증서의 상세 내용을 본 뒤에, 자신이 인증서를 발급받았던 사이트에 방문하여 인증서를 갱신하면 된다.

 

※ 인증서 내보내기 ※

 

  만약 [인증서 내보내기]를 하고 싶다면, 다음과 같이 인증서 내보내기 버튼을 누르면 된다.

 

 

  인증서 암호를 입력한 뒤에 다음과 같이 자신이 원하는 경로에 인증서를 내보내기할 수 있다.

 

728x90
반응형

Comment +0

728x90
반응형

  먼저 [검색] 버튼을 누른다.

 

 

  이후에 자신이 검색하고자 하는 내용을 입력하면 된다.

 

 

  이후에 [필터]에서 연도를 설정하면 된다.

 

728x90
반응형

Comment +0

728x90
반응형

※ 삼성전자 보통주 vs 삼성전자 우선주 ※

 

  삼성전자 (삼성전자 보통주): 일반적으로 말하는 삼성전자 주식이다. 보통주이므로, 주식을 갖고 있는 주주가 회사의 의사결정에 의견을 낼 수 있다. 일반적으로 1주당 하나의 의결권이 부여된다.

 

 

  삼성전자우 (삼성전자 우선주): 보통주와는 다르게 의결권이 없다는 특징이 있다. 하지만 보통주보다 배당률이 높다. 그래서 의결권을 포기하고 배당금을 더 많이 받기 위해 위해 삼성전자 우선주를 구매하는 사람이 많다. 네이버 국어사전에 "우선주"를 검색해 보면 다음과 같이 나온다.

 

 

  마찬가지로 네이버에 "삼성전자 우선주 주가"라고 검색하면 다음과 같은 그림을 확인할 수 있다.

 

 

 

※ 삼성전자 우선주 구매 방법 ※


  삼성전자 우선주를 구매하는 방법은 간단하다. 그냥 증권사 주식 거래 사이트에서 삼성전자 우선주 주식을 매매하면 된다. 키움증권 WTS에서는 다음과 같이 "삼성전자우"라고 검색한 뒤에 매수하면 된다.

 

 

※ 배당금 확인 방법 ※

 

  나중에 배당금이 들어오면 어떻게 확인할 수 있을까? 키움증권을 이용하는 경우 [거래내역] 탭에서 배당금을 확인할 수 있다.

728x90
반응형

Comment +0

728x90
반응형

  포항공대에서 학생회관이나 지곡회관의 회의실을 예약할 때는 POPO를 사용할 수 있다. 나는 포항공대에서 2년을 있었는데, 연구실에만 있다 보니까 회의실 예약하는 방법도 모르고 있었다. 학생회관 대회의실을 포함하여 다양한 회의실에 대하여 경우 동아리 활동을 하지 않는 일반적인 학생들도 예약할 수 있는 것으로 보인다.

 

  ▶ POPO 사이트: http://popo.postech.ac.kr/

 

POPO - 포포

POstenchian's POrtal, POPO 입니다!

popo.postech.ac.kr

 

  접속한 뒤에 로그인한다. 그리고 [장소 예약] 버튼을 눌러 예약 페이지로 들어갈 수 있다.

 

 

  이후에 원하는 장소를 골라 [예약하기] 버튼을 누른다.

 

 

  원하는 날짜와 시간을 설정하여 [예약]을 진행하면 된다.

 

728x90
반응형

Comment +0

728x90
반응형

  PyTorch에서는 ImageFolder 라이브러리를 제공하는데, 다음과 같이 계층적인 폴더 구조에서 데이터셋을 불러올 때 사용할 수 있다. 다음과 같이 각 이미지들이 각 클래스명(class name)을 갖는 폴더 안에 들어가 있는 구조라면, ImageFolder 라이브러리를 이용해 바로 불러올 수 있다.

 

dataset/
    class 0/
        0.jpg
        1.jpg
        ...
    class 1/
        0.jpg
        1.jpg
        ...
    ...
    class 9/
        0.jpg
        1.jpg
        ...


  이러한 ImageFolder 형식을 가지고 있지 않은 데이터셋 예제를 불러와서, ImageFolder 형식에 맞게 변형해 보겠다. 한 번 다음의 데이터셋 예제를 확인해 보자.

 

  ▶ Scene Classification Dataset 예제https://github.com/ndb796/Scene-Classification-Dataset

 

GitHub - ndb796/Scene-Classification-Dataset

Contribute to ndb796/Scene-Classification-Dataset development by creating an account on GitHub.

github.com

 

  기본적으로 Scene Classification Dataset은 25,000개가량의 다양한 자연 경치(scene) 이미지로 구성되어 있다. 이때 각 이미지에 대하여 카테고리(category) 정보가 주어진다. 먼저 다음과 같은 코드로 전체 이미지 데이터를 다운로드한다.

 

# 깃허브에서 데이터셋 다운로드하기
!git clone https://github.com/ndb796/Scene-Classification-Dataset
# 폴더 안으로 이동
%cd Scene-Classification-Dataset

 

  이때 데이터셋 폴더 구성은 다음과 같다.

 

Dataset/
    train-scene classification/
        train/ # 전체 이미지가 담긴 폴더입니다.
            0.jpg
            1.jpg
            2.jpg
            ...
            24333.jpg
            24334.jpg
        train.csv # 학습 이미지마다 클래스(class) 정보가 포함되어 있습니다.
    test_WyRytb0.csv # 최종 테스트(test) 이미지의 번호를 포함하며, 본 실습에서 사용하지 않습니다.

 

 

  장면(scene) 데이터셋은 정확히 24,335개의 다양한 자연 경치(scene) 이미지로 구성되어 있다. 이때 각 이미지는 150 X 150 크기를 가진다. 또한, 총 6개의 클래스(class)로 구성된다. 전체 클래스 목록은 다음과 같다.

 

    0. 빌딩(buildings)
    1. 숲(forests)
    2. 빙하(glacier)
    3. 산(mountains)
    4. 바다(sea)
    5. 거리(street)

 

  이때 다음과 같은 방법으로 학습 이미지의 개수를 확인할 수 있다. 구체적으로 os 라이브러리의 os.listdir()를 이용하여 이미지 폴더에 존재하는 파일 이름을 확인할 수 있다. 예를 들어 다음과 같은 코드로 이미지의 개수를 확인할 수 있다.

 

import os
import pandas as pd


path = 'train-scene classification/'

# 전체 이미지 개수 출력하기
file_list = os.listdir(path + 'train/')
print('전체 이미지의 개수:', len(file_list))

# 학습 이미지 확인하기
dataset = pd.read_csv(path + 'train.csv')
print('학습 이미지의 개수:', len(dataset))
print('학습 이미지별 클래스 정보')
dataset.head()

 

 

  실행 결과는 다음과 같다.

 

 

  이때 클래스별 학습 이미지의 개수를 구하고자 한다면 다음과 같이 할 수 있다.

 

import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams['figure.figsize'] = (8.0, 6.0) # 그림의 기본 크기 설정

# 각 클래스별 개수 출력
print('클래스 0의 개수:', len(dataset[dataset.label == 0]))
print('클래스 1의 개수:', len(dataset[dataset.label == 1]))
print('클래스 2의 개수:', len(dataset[dataset.label == 2]))
print('클래스 3의 개수:', len(dataset[dataset.label == 3]))
print('클래스 4의 개수:', len(dataset[dataset.label == 4]))
print('클래스 5의 개수:', len(dataset[dataset.label == 5]))

# 각 클래스에 따른 학습 이미지의 개수를 출력하기
fig, ax = plt.subplots(figsize = (10, 4)) # 그림 크기 설정
sns.countplot(x ='label', data=dataset)
plt.xlabel("Class Label")
plt.ylabel("Number of Samples")
plt.show()

 

  실행 결과는 다음과 같다.

 

 

  이때 특정한 이미지를 불러와 화면에 출력하고자 한다면 다음과 같이 할 수 있다. 아래 코드는 첫 번째 이미지를 불러와 화면에 출력하는 코드다.

 

from skimage.transform import resize
from PIL import Image
import numpy as np


img = Image.open(path + 'train/' + file_list[0])
img = np.asarray(img)
img = resize(img, (64, 64, 3))
print('이미지의 해상도:', img.shape)

# 이미지 출력하기
plt.imshow(img)
plt.show()

 

  실행 결과는 다음과 같다.

 

 

  이어서 학습/검증 데이터셋을 나눌 수 있다. 이때 간단히 sklearn 라이브러리 train_test_split()을 이용하면 된다. 예를 들어 학습 이미지 데이터를 8:2 비율로 학습(training)과 검증(validation)으로 나누는 예제는 다음과 같다.

 

from sklearn.model_selection import train_test_split


train_dataset, val_dataset = train_test_split(dataset, test_size=0.2)

print('학습 데이터셋 크기:', len(train_dataset))
print('검증 데이터셋 크기:', len(val_dataset))

 

  실행 결과는 다음과 같다. 이제 결과적으로 데이터셋이 나누어진 것이다.

 

 

  이제 나누어진 데이터셋을 적절한 폴더에 저장하기 위해 다음과 같이 먼저 폴더를 만든다. 클래스 개수가 6개뿐이므로, 간단히 다음과 같이 모든 폴더를 만들 수 있다.

 

!mkdir Scene-Classification-Dataset-Split
!mkdir Scene-Classification-Dataset-Split/train
!mkdir Scene-Classification-Dataset-Split/train/buildings
!mkdir Scene-Classification-Dataset-Split/train/forests
!mkdir Scene-Classification-Dataset-Split/train/glacier
!mkdir Scene-Classification-Dataset-Split/train/mountains
!mkdir Scene-Classification-Dataset-Split/train/sea
!mkdir Scene-Classification-Dataset-Split/train/street
!mkdir Scene-Classification-Dataset-Split/val
!mkdir Scene-Classification-Dataset-Split/val/buildings
!mkdir Scene-Classification-Dataset-Split/val/forests
!mkdir Scene-Classification-Dataset-Split/val/glacier
!mkdir Scene-Classification-Dataset-Split/val/mountains
!mkdir Scene-Classification-Dataset-Split/val/sea
!mkdir Scene-Classification-Dataset-Split/val/street

 

  실행하면 다음과 같이 전체 폴더가 구성되는 것을 확인할 수 있다.

 

 

  이제 ImageFolder 형식에 맞게 이미지를 저장해보자. 모든 이미지는 (64 X 64 X 3) 형식으로 resize하여 저장한다.

 

import time


classes = ['buildings', 'forests', 'glacier', 'mountains', 'sea', 'street']

######### 학습 데이터셋 #########
start_time = time.time() # 시작 시간

# 데이터 정보를 하나씩 확인하며
for index, row in train_dataset.iterrows():
    # 이미지 정보를 배열에 담기
    img = Image.open(path + 'train/' + row['image_name'])
    img = np.asarray(img)
    img = resize(img, (64, 64, 3))
    img = Image.fromarray((img * 255).astype(np.uint8))
    saved = 'Scene-Classification-Dataset-Split/train/' + classes[row['label']] + '/' + str(index) + '.png'
    img.save(saved, 'PNG')

print("소요된 시간(초 단위):", time.time() - start_time) # 실행 시간

######### 검증 데이터셋 #########
start_time = time.time() # 시작 시간

# 데이터 정보를 하나씩 확인하며
for index, row in val_dataset.iterrows():
    # 이미지 정보를 배열에 담기
    img = Image.open(path + 'train/' + row['image_name'])
    img = np.asarray(img)
    img = resize(img, (64, 64, 3))
    img = Image.fromarray((img * 255).astype(np.uint8))
    saved = 'Scene-Classification-Dataset-Split/val/' + classes[row['label']] + '/' + str(index) + '.png'
    img.save(saved, 'PNG')

print("소요된 시간(초 단위):", time.time() - start_time) # 실행 시간

 

  이후에 만들어진 폴더를 압축(.zip)하여 저장한다.

 

!zip -r Scene-Classification-Dataset-Split.zip ./Scene-Classification-Dataset-Split/*
728x90
반응형

Comment +0

728x90
반응형

  저는 Adobe Acrobat Pro DC를 이용하고 있습니다. 자신이 수정하고자 하는 PDF 파일을 Adobe Acrobat Pro DC를 이용해 PDF 파일을 열어줍니다. 저는 간단히 강의 자료를 열어 주었으며, 이후에 [페이지 구성] 버튼을 눌러줍니다.

 

 

  [페이지 구성]을 연 뒤에는 다음과 같이 자신이 원하는 페이지를 선택하여 삽입, 추출, 교체, 삭제 등의 작업을 수행할 수 있습니다.

 

 

  PDF 파일의 수정이 완료되면 다음과 같이 [파일] - [다른 이름으로 저장]을 눌러 저장할 수 있습니다.

 

728x90
반응형

Comment +0

728x90
반응형

  세 개의 릴레이션이 있는 상황을 가정합시다. 실습으로 다루고자 하는 데이터베이스사원(Employee), 회사(Company), 소속(Affiliation) 세 가지 테이블로 구성됩니다. 그 세부적인 정보는 다음과 같습니다.

 

※ 사원(Employee) 릴레이션 ※

 

  사원의 이름, 거주 도시 정보를 포함하고 있습니다.

 

Employee_ID Employee_Name Employee_City
1 Seo 청주
2 Chung 서울
3 Lee 인천
4 Kim 대전
5 Park 서울
6 Moon 서울

 

※ 회사(Company) 릴레이션 ※

 

  회사의 이름, 회사가 위치한 도시 정보를 포함하고 있습니다.

 

Company_Name Company_City
SK 인천
LG 청주
삼성 서울

 

※ 소속(Affiliation) 릴레이션 ※

 

  사원의 번호, 회사의 이름, 연봉 정보를 포함하고 있습니다. 즉, 어떠한 사원이 어떠한 회사에서 일을 하고 있는지에 대한 정보를 담고 있습니다.

 

Employee_ID Company_Name Pay
1 SK 10000
2 LG 900
3 삼성 30000
4 삼성 50000
5 삼성 100
6 LG 200

 

※ 데이터베이스 구축하기 ※

 

  다음과 같이 데이터베이스를 생성하고, 테이블을 구축하여 기본적인 데이터를 삽입할 수 있습니다.

 

/* 사원(Employee) 테이블 */
CREATE TABLE Employee(
    Employee_ID INT PRIMARY KEY,
    Employee_Name TEXT,
    Employee_City TEXT
);

INSERT INTO Employee VALUES (1, 'Seo', '청주');
INSERT INTO Employee VALUES (2, 'Chung', '서울');
INSERT INTO Employee VALUES (3, 'Lee', '인천');
INSERT INTO Employee VALUES (4, 'Kim', '대전');
INSERT INTO Employee VALUES (5, 'Park', '서울');
INSERT INTO Employee VALUES (6, 'Moon', '서울');

/* 회사(Company) 테이블 */
CREATE TABLE Company(
    Company_Name TEXT PRIMARY KEY,
    Company_City TEXT
);

INSERT INTO Company VALUES ('SK', '인천');
INSERT INTO Company VALUES ('LG', '청주');
INSERT INTO Company VALUES ('삼성', '서울');

/* 소속(Affiliation) 테이블 */
CREATE TABLE Affiliation(
    Employee_ID INT,
    Company_Name TEXT,
    Pay INT
);

INSERT INTO Affiliation VALUES (1, 'SK', 10000);
INSERT INTO Affiliation VALUES (2, 'LG', 900);
INSERT INTO Affiliation VALUES (3, '삼성', 30000);
INSERT INTO Affiliation VALUES (4, '삼성', 50000);
INSERT INTO Affiliation VALUES (5, '삼성', 100);
INSERT INTO Affiliation VALUES (6, 'LG', 200);

 

Q1. 회사명이 'LG'인 회사에서 일하는 모든 사원의 이름과 거주하는 도시들을 출력합니다.

SELECT e.Employee_Name, e.Employee_City
    FROM Employee as e, Affiliation as a
    WHERE e.Employee_ID == a.Employee_ID
        AND a.Company_Name = "LG";

 

Q2. 소속한 회사가 위치한 도시와 다른 도시에 거주하는 모든 사원의 이름, 소속 회사 이름, 소속 회사의 도시, 사원이 거주하는 도시를 출력합니다.

SELECT e.Employee_Name, c.Company_Name, c.Company_City, e.Employee_City
    FROM Employee as e, Company as c, Affiliation as a
    WHERE e.Employee_ID == a.Employee_ID
        AND c.Company_Name == a.Company_Name
        AND e.Employee_City != c.Company_City;

 

Q3. 각 회사별로 회사 이름과 사원의 수, 평균 월급을 출력합니다.

 

  간단한 버전은 다음과 같습니다.

SELECT a.Company_Name, COUNT(a.Employee_ID), AVG(a.Pay)
    FROM Affiliation as a
    GROUP BY a.Company_Name;

  조금 더 어렵게 작성 소스코드 버전은 다음과 같습니다.

SELECT c.Company_Name, COUNT(e.Employee_ID), AVG(a.Pay)
    FROM Employee as e, Company as c, Affiliation as a
    WHERE e.Employee_ID == a.Employee_ID
        AND c.Company_Name == a.Company_Name
    GROUP BY a.Company_Name;

 

Q4. 각 회사별로 소속 사원들의 평균 월급보다 높은 월급을 받는 종업원들의 사원의 번호, 회사 이름, 월 급여, 해당 회사의 평균 월급을 출력합니다.

SELECT a.Employee_ID, a.Company_Name, a.Pay, c_sum.Pay
    FROM Affiliation as a, (SELECT t.Company_Name, AVG(t.Pay) as Pay FROM Affiliation as t GROUP BY t.Company_Name) as c_sum
    WHERE a.Company_Name == c_sum.Company_Name
        AND a.Pay > c_sum.Pay;

 

Q5. 'LG'의 (하나 혹은 여러) 사원보다 월급을 많이 받는 모든 사원들의 사원의 번호, 회사 이름, 월 급여를 출력합니다.

SELECT a.Employee_ID, a.Company_Name, a.Pay
    FROM Affiliation as a, (SELECT MIN(t.Pay) as Pay FROM Affiliation as t WHERE t.Company_Name == "LG") as c_sum
    WHERE a.Pay > c_sum.Pay;

혹은 다음과 같이 할 수 있습니다.

SELECT a.Employee_ID, a.Company_Name, a.Pay
    FROM Affiliation as a
    WHERE a.Pay > (SELECT MIN(t.Pay) as Pay FROM Affiliation as t WHERE t.Company_Name == "LG");

728x90
반응형

Comment +0

728x90
반응형

  네이버에 "주식 거래 시간"을 검색하면 다음과 같은 정보가 나온다.

 

 

  위 표에 나와 있듯이 국내 주식 매매 거래 시간의 정규시간09:00~15:30이다.

 

  기본적으로 해당 날짜에 형성된 종가의 위아래로 10% 이내의 가격을 [시간 외 단일가]라고 한다. 장이 마감한 이후에도 이러한 [시간 외 단일가]16:00~18:00 사이에 거래할 수 있다. 이때 16:00~18:00 사이에서 매 10분마다 1번씩 거래가 체결된다. 예를 들어 16:00~16:10까지의 주문을 모아서 16:10에 체결을 진행하고, 또 16:10~16:20까지의 주문을 모아서 16:20에 체결을 진행하는 방식이다.

  그래서 16:00 시간대 이후라고 해도 갑자기 호재가 터지는 경우에는 매수 주문이 많아져서, 시간 외 상한가에 도달하는 경우도 있다. 이런 경우에는 시간 외 상한가다음날 종목 시세에 영향을 미쳐서, 장 시작과 동시에 상승장이 시작되기도 한다.

 

※ 키움증권 웹 사이트(웹 트레이딩, WTS)을 이용해 시외가 보는 방법 ※

 

  시외가를 보는 방법은 간단하다. 먼저 키움증권 웹 사이트에 로그인하자. 이후에 [주식주문(웹트레이딩)] 버튼을 누른다.

 

  이후에 원하는 종목을 선택한 뒤에 오른쪽 위에 있는 [시간 외 단일가] 버튼을 누른다. 예를 들어 필자는 HMM을 종목으로 선택했으며, [시간 외 단일가]를 확인한 결과 43,050원으로 가격이 형성된 것을 확인할 수 있었다.

 

728x90
반응형

Comment +0

728x90
반응형

  DB Browser for SQLite (DB4S)SQLite과 호환되는 데이터베이스 설계 및 수정 소프트웨어입니다. 웹 사이트에 방문한 뒤에 간단하게 설치하여 곧바로 사용할 수 있습니다. DB4S는 다음의 웹 사이트에 방문하여 상세한 정보를 확인할 수 있습니다.

 

  ▶ DB Browser for SQLite 공식 홈페이지: https://sqlitebrowser.org/

 

  DB4S 공식 페이지에 접속한 뒤에 [Download] 페이지로 이동하면 다음과 같은 화면을 확인할 수 있습니다. 자신의 운영체제에 맞는 설치 프로그램을 다운로드받으면 됩니다. 저는 윈도우(Windows) 운영체제에 맞는 64-bit 버전의 프로그램을 다운로드했습니다.

 

 

  설치 프로그램을 실행하여, 가장 먼저 라이센스에 동의하고 설치를 진행합니다.

 

 

  다음과 같이 설정을 진행합니다.

 

 

  이후에 설치(install)를 진행하면 됩니다. 설치 이후에는 실행 프로그램을 실행하여 열 수 있습니다.

 

 

※ 데이터베이스 생성하기 ※

 

  [새 데이터베이스] 버튼을 눌러 새로운 데이터베이스를 생성할 수 있습니다.

 

 

  예를 들어 다음과 같이 test.db라는 이름의 데이터베이스를 생성할 수 있습니다.

 

 

  데이터베이스가 생성되면 다음과 같이 [데이터베이스 구조] 탭에서 데이터베이스의 정보를 확인할 수 있습니다.

 

 

  이후에 [SQL 실행] 탭으로 이동하여 자신이 원하는 SQL 쿼리를 입력할 수 있습니다.

 

728x90
반응형

Comment +0

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
반응형

Comment +0