Acdong
Learn by doing
Acdong
전체 방문자
오늘
어제
  • 분류 전체보기
    • Economy
      • Saving Money
    • Self-improvement
    • Thoughts
    • Machine learning
      • Deep Learning
      • Chatbot
      • NLP
    • MLops
      • AWS
      • Container
      • Serving
    • Computer Vision
    • Data Science
      • ADsP
      • R
    • Project
    • Python
      • Data Structure & Algorithm
    • C,C++
    • API
      • ElasticSearch
    • Error Note
    • Network
    • RDBMS
      • SQL

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • [GitHub]

인기 글

태그

  • nlp
  • 어텐션
  • 머신러닝
  • 포인터
  • R시각화
  • R그래프
  • 데이터 전처리
  • SentenceTransformer
  • 기계학습
  • sbert
  • Numpy
  • 이미지 전처리
  • R
  • 회귀계수
  • 존댓말 반말 분류
  • 다중공선성
  • pandas
  • Python
  • plot()
  • c포인터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Acdong

Learn by doing

[SQL] Python 에서 SQL을 다루는 방법.
RDBMS/SQL

[SQL] Python 에서 SQL을 다루는 방법.

2021. 1. 4. 18:36
728x90

1. Python에서 데이터베이스에 연결하는 법

import sqlite3 # built-in library (Python 2.x & 3.x)

dbpath = "chinook.db" 

conn = sqlite3.connect(dbpath)
cur = conn.cursor() 

Python에서 SQL을 사용할 때에는 먼저 db와 연결해주는 connect 함수와

실제로 그 안에서 일을 하는 cursor 가 있다. 

* 실제로 일하는 건 cursor 가 다한다.

 

dbpath 변수는 데이터베이스 파일의 경로를 지정하는 곳이고 파일이 없으면 새로 생성한다.


2. python 에서 SQL에 데이터를 삽입하는 방법

script = """
DROP TABLE IF EXISTS employees;

CREATE TABLE employees(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, 
salary REAL,
department TEXT,
position TEXT,
hireDate TEXT);

INSERT INTO employees(name, salary, department, position, hireDate) VALUES('Dave', 300, 'Marketing', 'LV1', '2020-01-01');
INSERT INTO employees(name, salary, department, position, hireDate) VALUES('Clara', 420, 'Sales', 'LV2', '2018-01-11');
INSERT INTO employees(id, name, salary, department, position, hireDate) VALUES(3, 'Jane', 620, 'Developer', 'LV4', '2015-11-01');
INSERT INTO employees VALUES(4, 'Peter', 530, 'Developer', 'LV2', '2020-11-01'); 
"""

cur.executescript(script)
conn.commit() # 실제로 DB에 위 Table & Data가 저장된다.

실제 쿼리문을 작성할때는 문자열로 작성해서 cur 객체에 executescript()로 쿼리문을 전달하고.

데이터베이스의 commit과 동일하게 변경을 적용한다.

 

execute(sql[, parameters])
execute()는 단일 SQL 문만 실행합니다.
하나 이상의 명령문을 실행하려고 하면 Warning이 발생합니다.
하나의 호출로 여러 SQL 문을 실행하려면 executescript()를 사용하십시오.
executemany(sql[, parameters])
시퀀스 seq_of_parameters에 있는 모든 매개 변수 시퀀스나 매핑에 대해 SQL 명령을 실행합니다.
 sqlite3 모듈은 시퀀스 대신 매개 변수를 산출하는 이터레이터도 허용합니다.
executescript(sql_script)¶

하나의 호출로 여러 SQL 문을 실행하려면 executescript()를 사용하십시오.
이것은 한 번에 여러 SQL 문을 실행하기 위한 비표준 편의 메서드입니다.
먼저 COMMIT 문을 실행한 다음, 매개 변수로 가져온 SQL 스크립트를 실행합니다.

쿼리문을 전달하는 방법은 위의 3가지가 있습니다.

 

executemany(sql[, parameters])

data = [('Elena', 510, 'Recruiter', 'LV3', '2020-07-01'), 
        ('Sujan', 710, 'HR', 'LV5', '2014-06-01'),
        ('Jake', 210, 'CEO', 'LV8', '2012-01-01')]

cur.executemany("INSERT INTO employees(name, salary, department, position, hireDate) 
					VALUES(?, ?, ?, ?, ?)", data)
conn.commit()

VALUES(?, ?, ?, ?, ?) 의 값의 data 로 들어간 튜플이 각각 대입하는 방법이다.


3. Database에서 Python 으로 가져오는 방법

fetchall() 모든 데이타를 한꺼번에 클라이언트로 가져올 때 사용된다.
fetchone() 한번 호출에 하나의 Row 만을 가져올 때 사용된다.
fetchmany(n) n개 만큼의 데이타를 한꺼번에 가져올 때 사용된다.

* print(row) : 각 row는 Tuple로 리턴되며, 컬럼 순서대로 데이타가 표시된다.

cur.execute("SELECT * FROM employees;")

employee_list = cur.fetchall()

for employee in employee_list:
    print(employee)

 

 3-1 Database에서 pandas Dataframe으로 가져오는 방법

import pandas as pd

df = pd.read_sql_query("SELECT * FROM employees", conn) 


4.연결해제

conn.close()

연결을 Close 해주어야 DB 파일인 .sqlite 파일의 삭제 등이 가능합니다.


5. 데이터베이스 삽입과 데이터프레임변환 한번에 하기

script = """
INSERT INTO artists (name)
VALUES
    ("Buddy Rich"),
    ("Candido"),
    ("Charlie Byrd");
""" 
cur.execute(script) 

script = """
SELECT
    ArtistId,
    Name
FROM
    Artists
ORDER BY
    ArtistId DESC;
""" 
cur.execute(script) 

df = pd.read_sql_query(script, conn)
df.head()

 

실전 예제 )  크롤링 도중 하나하나씩 db 파일에 데이터를 삽입.

for li in boxItems:
      title = li.find_element_by_class_name('proTit').text # li.find_element_by_css_selector('h5.proTit').text
      price = li.find_element_by_class_name('proPrice').text.replace(',','').replace('원~','') # li.find_element_by_css_selector('.proPrice')
      image = li.find_element_by_class_name('img').get_attribute('src')

      sql_query = "INSERT INTO tour_crawl(title, price, image) values('{}',{},'{}')".format(title, price, image) # TEXT인 제목은 ''로 감싸주는 것에 유의
      print('SQL Query :', sql_query[:90], "...")

      cur.execute(sql_query)
      conn.commit()
반응형
저작자표시 비영리 (새창열림)

'RDBMS > SQL' 카테고리의 다른 글

[pymysql]. 파이썬 SQL 쿼리 한꺼번에 전송하기  (4) 2021.07.15
[SQLD] .SQL 최적화 원리 (Optimizer)  (0) 2020.09.01
[SQLD]. SQL 기본  (0) 2020.08.26
[SQLD]. 데이터 모델과 성능( 정규화 , 반정규화 , 분산 데이터 베이스)  (0) 2020.08.25
[SQLD] 데이터 모델링의 이해(1)  (0) 2020.08.13
    'RDBMS/SQL' 카테고리의 다른 글
    • [pymysql]. 파이썬 SQL 쿼리 한꺼번에 전송하기
    • [SQLD] .SQL 최적화 원리 (Optimizer)
    • [SQLD]. SQL 기본
    • [SQLD]. 데이터 모델과 성능( 정규화 , 반정규화 , 분산 데이터 베이스)
    Acdong
    Acdong
    E-mail : alswhddh@naver.com / 자연어처리와 MLops 를 연구하고 있는 스타트업 개발자입니다.

    티스토리툴바