다시 이음

Data Engineering - SQL, DBapi 본문

AI 일별 공부 정리

Data Engineering - SQL, DBapi

Taeho(Damon) 2021. 9. 15. 11:19

안녕하세요.

 

이번 섹션들어오면서 이론이 많지가 않고 실습위주라 블로깅 하기가 쉽지 않네요.

 

간단하게만 이론을 보고 그 외에는 Trouble shooting을 하려고 합니다.

 

SQL(Structured Query Language)

 

SQL 이란?

 

SQL 이란 데이터베이스 용 프로그래밍 언어입니다. 한 마디로 데이터베이스에 쿼리(질의문)를 보내 원하는 데이터만을 가져올 수 있게 해줍니다.

 

하나의 언어인 SQL 혹은 Structured Query Language 은 데이터베이스 언어의 기준으로 주로 관계형 데이터베이스(RDB)에서 사용이 됩니다.

예를 들어 MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 볼 수 있습니다.

위의 분류는 데이터베이스의 종류이며 각각 장단점을 가지고 있습니다.

 

관계형 데이터베이스(Relational Database)

 

  • 데이터 : 각 항목에 저장되는 입니다.
  • 테이블 (혹은 relation) : 사전에 정의된 행과 열로 구성되어 있는 체계화된 데이터입니다.
  • 필드 (혹은 column) : 테이블의 을 가리킵니다.
  • 레코드 (혹은 tuple) : 테이블의 한 의 저장된 정보입니다.
  • 키 : 테이블의 각 레코드를 구분할 수 있는 값. 각 레코드마다 고유값이어야 하며 기본키 (primary key)외래키 (foreign key) 등이 있을 수 있습니다.
  • 트랜잭션 : 정보의 교환이나 데이터베이스 갱신 등 일련의 작업들에 대한 연속처리단위를 의미
  • 스키마(schema) 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조

 

ACID

 

데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어입니다.

 

  • 원자성(Atomicity)은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력입니다. 쉽게 말해 1단계가 실패하면 2단계도 실패해야하고, 2단계가 실패해도 1단계가 진행되서는 안됩니다.

 

  • 일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미합니다. 예를 들어 어느 테이블이 있을때 필드가 이름 과 나이로 정해져 있을때 하나의 값(이름 혹은 나이)을 가진 트랜잭션이 성립될 수 없습니다.

 

  • 독립성(Isolation)은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미합니다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미합니다. 공식적으로 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미합니다. 

 

  • 지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미합니다. 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미합니다. 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있습니다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있습니다.

 

DBapi

 

SQL문을 사용하여 즉시 실행 할 수 있으면서 바로 값을 확인 할 수 있는 DBeaver와 같은 SQL 클라이언트이자 데이터베이스 관리 도구가 있습니다.

 

그외에도 터미널 혹은 vs code와 같은 편집기에서 python을 실행하여 편집할 수도 있습니다. 하지만 이러한 경우는 결과를 확인하기가 어렵습니다.

#sqlite3 데이터베이스 편집기 연결
import sqlite3
#'test.db' 데이터베이스 생성 혹은 연결하기
conn = sqlite3.connect('test.db')
#편집하는 행을 표현하는 커서를 생성
cur = conn.cursor()
#execute 메소드를 통해 SQL문을 바로 전송
cur.execute("""CREATE TABLE test_table (
				name VARCHAR(32),
				age INT);
			""")
#위의 execute메소드를 통해 데이터베이스 편집을 다 했다면 꼭 commit을 해주어야 반영이 됩니다.
conn.commit()

 

이론은 이렇게 정리만 하고 다음 포스팅에서는 SQL문 명령어와 자주 마주치게 될 상황을 해결하는 방법을 준비해오겠습니다.