* postgresql 특징 : opensource, 국내 이용 느는 추세

 

* 사용법 :

- 설치 폴더(pg_hba.conf) 에서 외부 접속 Address 0.0.0.0/0 설정

- 서버 start ( CLI - bin folder 경로에서 : pg_ctl -D ../data start )

- 서버 종료 ( CLI - bin folder 경로에서 : pg_ctl -D ../data stop )

- creaate user , owner

- database 생성 owner 설정

- psycopg2 모듈을 이용해 python connection 객체 획득

 

import psycopg2 as pg
from faker import Faker

faker = Faker(locale=['ko_KR'])

conn = pg.connect(host="10.10.20.99", dbname="db_gwang", user="postgres", password="", port="5432")
# conn = pg.connect(host="127.0.0.1", dbname="db_gwang", user="postgres", password="", port="5432")
c = conn.cursor()

for i in range(1000):
    c.execute("insert into tb_sample(id, name) values (%s, %s)", (i, faker.name(), ))
conn.commit()

conn.close()

를 통해서 짝궁 db에 접속하여 가짜 이름 1000줄을 저장시켰다.

 

conn = pg.connect(host="10.10.20.99", dbname="db_gwang", user="postgres", password="", port="5432")
c = conn.cursor()

c.execute("select * from tb_sample")
result = c.fetchall()
for row in result:
    print(row)

conn.close()
(0, '김보람')
(1, '백서영')
(2, '권민준')
(3, '김진호')
(4, '송재호')
(5, '김지후')
(6, '엄건우')
(7, '김수민')
(8, '김수빈')
(9, '배영일')
(10, '곽수민')
(11, '이지혜')
(12, '김예준')
(13, '엄승현')
(14, '이정호')
(15, '김옥자')
(16, '김상훈')
(17, '서영순')
(18, '박현지')
(19, '홍지훈')
(20, '장수빈')
(21, '이경수')
....

감사합니다.

오늘의 퀘스트는 Titanic table을 통해 다음과 같은 데이터를 뽑아내는 것이다. 과연 할 수 있을 것인가?

 

 

 

 

1.

2.

3.

4.

5.

 

테이블 구조는 다음과 같다. 한글은 적절한 글자크기를 인식 못하는지, 자꾸 박스 틀을 깨버리는데, 해결 방법이 없는 것 같다.

 

 

 

 

셀프 물음

1.

4일동안 가장 승차가 많은 정류소 top 10을 구하세요.

2.

4일동안 아침 7시에 승차가 많은 정류소 top 10을 구하세요.

3.

4일동안 승차인원 가장 적은 정류소 top 10을 구하세요.

4.

4월 28일 이용객이 가장 많은 버스 노선 top 10을 구하세요.

5.

4일간 봉선 37의 평균 하루 승차인원은 몇 명인지 구하세요.

6.

4월 29일 문흥 18의 시간대별 승차인원은 어떻게 됩니까?

 

여기서 멈추지 않고 matplotlib으로 시각화를 해보았습니다.

 

7.

(시각화) 봉선 37의 시간대별 이용객이 4일동안 어떻게 변했는가?

def make_plain_subplots():
    fig, ax = plt.subplots()
    list_x_1, list_y_1 = get_data_by_date_and_bus_no('봉선37', '20230427')
    list_x_2, list_y_2 = get_data_by_date_and_bus_no('봉선37', '20230428')
    list_x_3, list_y_3 = get_data_by_date_and_bus_no('봉선37', '20230429')
    list_x_4, list_y_4 = get_data_by_date_and_bus_no('봉선37', '20230430')
    ax.plot(list_x_1, list_y_1, label='427')
    ax.plot(list_x_2, list_y_2, label='428')
    ax.plot(list_x_3, list_y_3, label='429')
    ax.plot(list_x_4, list_y_4, label='430')
    ax.legend()
    fig.suptitle('bus trend')
    plt.show()

def get_data_by_date_and_bus_no(bus_name, date):
    conn = sqlite3.connect("sample_bus_info_2.db")
    c = conn.cursor()
    list_x = list()
    list_y = list()

    result_list = c.execute("""
    select measured_time, transaction_count from tb_bus where bus_name=(?) and date = (?) and boarding_type='승차' and bus_stop_id=5218
        order by date asc;
    """, (bus_name, date,)).fetchall()
    for row in result_list:
        list_x.append(row[0])
        list_y.append(row[1])
    conn.commit()
    conn.close()

    return list_x, list_y

 

또한 오후엔 OOP와 Class 에 대해 짧게 발표를 했습니다.

 

소수의 학우님들의 요청을 받아 소규모 그룹으로 진행할 예정이었습니다만, 통 크게 전체 학우들을 대상으로

 

발표를 하라고 교수님께서 시간을 내어주셨기 때문에, 열심히 정보전달을 위해 노력해보았습니다.

 

제가 아는 것을 남들이 알도록 설명시킨다는게 참 쉽지 않다는걸 다시 한번 느꼈습니다.

 

그래도 몇몇 학우님들께서 조금은 이해하는데 도움이 되었다고 긍정적인 피드백을 주셔서, 많은 용기와 보람이 되었습니다.

 

감사합니다.

 

 

올해 3월 정보처리기사 필기를 통과하고, 4월 말 중에 실기 시험을 예정하고 있다.

 

대부분의 문제가 실무 위주의 코딩 + DB 위주의 문제라고 하니 직접 타이핑하면서 공부해보고자 한다.

 

꼭 그럴 필요는 없지만, linux 상에서 db 환경을 조성하기 위해..

 

저는 실습실 Windows 에 WSL 을 설치하고, Ubuntu 상에서 mysql 을 설치하여 진행했습니다.

 

(WSL : 윈도우 기본 배포로 리눅스 가상환경을 간편하게 설치해줌)

(Ubuntu : Microsofts 에서 기본 제공하는 유명한 무료 리눅스 운영체제)

(mysql : Oracle사의 무료 DB)

 

Ubuntu logo image
MySQL logo image

(설치 방법은 검색으로 쉽게 찾을 수 있으니, 학우분들 중에 혹시나 안되면 설치 도와드리겠습니다)

 

https://www.mysqltutorial.org/

MySQL Tutorial – A comprehensive MySQL Tutorial

MySQL Tutorial website provides a comprehensive MySQL tutorial that helps you master MySQL fast, easy & fun.

www.mysqltutorial.org

 

Window 커맨드창에서 '''wsl'''을 명령하면, linux 가상 환경으로 접속된다.

C:\Users\KDT107>wsl
 

그러면, sudo 명령어를 통해 mysql을 실행시킨다.

user@DESKTOP-R7GJ6RM:/mnt/c/Users/KDT107$ sudo mysql
 
 
사진 삭제

사진 설명을 입력하세요.

그럼 다음과 같은 화면으로 정상접속 되는 것을 확인해볼 수 있다.

 

혹시나 다시 안들어가지는 경우가 있는데, 다음 명령어를 한 번 실행시키면 접속 가능해진다.

$ sudo service mysql restart
 

 

 

===========================================

 

 

※ SQL 은 무엇인가?

Structured Query Language 의 약자이다. 해석하면 구조화된 질의 언어.

 

결론은 구조가 정해진 구문을 만들어 전달하면 DB가 이를 대답하는 것이다.

 

 

※ 왜 SQL, DB를 사용하는가?

SQL을 사용하는 이유는 DB를 조작하기 위해 있는 것. DB는 Database의 약자로 데이터를 저장하는 곳이란 의미이다.

현재엔 컴퓨터 과학의 발전으로 많은 데이터들을 구조화하여 빠르게 저장하고 불러올 수 있는 능력을 가지고 있다. 또한, 연결의 가지(connection pool)를 조절함으로써 다중 접속이 가능하게 정보에 접근할 수 있다. 이 이후로는 너무 깊어지므로 이정도만 정리한다.

 

※ RDBMS?

relational database management system의 약어로 DB들 중에서, 중복을 줄이고 속도를 올리기 위해 관계형 데이터베이스란 것이 있다. 일단 RDBMS 타입이 현재 주류를 이루고 있으며, 오늘 사용할 MySQL도 RDBMS이다. 조작한다는 건, 표도 만들고 지우고 수정하고, 정보(row)를 추가하고, 롤백(?)하고 할 수 있어야한다.

 

※ 트랜잭션? (Transaction)

한 번 내뱉은 말은 수정할 수 있나? 없다. 그러기 때문에 신중해야한다.

DB는 중요한 정보가 담긴 곳이며, 여러 사람이 볼 수 있는 곳이다.

만약 정보를 쓰다가 중간에 에러가 발생하면 어떻게 해야하는가? 그대로 놔두어도 될까? 안된다.

이런 일을 방지하기 위해 DB에는 트랜잭션이라는 일련의 과정을 거쳐, 수정할 테이블을 잠깐 복사해서 입력 처리를 마무리하고, 이상이 없으면 본체에 합본(commit) 시킨다. 만약 중간에 에러가 발생하면 없던 일로 되돌리기 위해 롤백(rollback) 한다. 이런 과정을 Transaction 이라 한다.

 

 

※ 배우면 좋은 점?

모든 RDBMS SQL syntax에 대해 알 필요는 없다. SQL자체가 ISO 국제 공통 기준으로 어느정도 비슷하며, 요즘은 ORM(Object-Relational Mapping) 이라고 해서 자동으로 테이블 생성도 해준다. 그래도 기본은 알면, 원하는 만큼 DB를 직접 다룰 수 있게 된다.

 

더군다나 우린 데이터 기반 AI SW개발자이다. 데이터 기반이면, DB와 친해질 수 밖에 없다!

 

===========================================

 

※ SQL은 크게 네 가지로 분류한다. DDL, DCL, DML, TCL

DDL : Database Definition Language

DCL : Database Control Language

DML : Database Manipulation Language

TCL : Transaction Control Language

 

쉽게 생각한다. 만드는 말, 정보 접근에 대해 통제하는 말, 정보를 추가/삭제/수정하는 말, 트랜잭션을 조작하는 말들로 분류해놓고, 모두 RDBMS 롤 조작하므로 SQL이라고 통칭한다.

 

감사합니다.

+ Recent posts