0%

SQLAlchemy

SQL Alchemy

python 에서 사용하는 ORM 입니다.

ORM 이란? : Object Relational Mapping

데이터 베이스를 객체화 시켜서 데이터 베이스에 있는 데이터를 CRUD(create,read,update,delete)할수 있습니다. 쿼리 대신 함수 형태로 CRUD를 할수 있습니다. 사용하는 데이터 베이스를 변경하는 경우 엔진을 바꾸면 됩니다. 따라서 쿼리문을 몰라도 데이터 베이스를 조작할수 있습니다.

1
2
3
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker #sql에 연결 시켜주는 함수

데이터 베이스 연결

://유저이름.비밀번호:퍼블릭 ip/데이터 베이스 이름

1
engine = create_engine("mysql://root:***@<퍼블릭 ip>/test")

테이블 객체 생성을 위한 클래스 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Base = declarative_base()

class User(Base):

__tablename__ = "user" #테이블 이름

#컬럼 데이터 타입 작성
user_id = Column(Integer,primary_key=True)
name = Column(String(20))
email = Column(String(30))
age = Column(Integer)
rdate = Column(DateTime)


# 생성자 함수
def __init__(self,name,email,age,rdate):
self.name = name
self.email = email
self.age = age
self.rdate = rdate

# repr 함수
def __repr__(self):
return "<User {},{},{},{}>".format(
self.name, self.email, self.age, self.rdate)

데이터 베이스와 객체를 연결

1
2
3
4
5
6
7
8
9
10
# engine에 연결된 데이터 베이스(test)에 테이블 생성
Base.metadata.create_all(engine)
# Base를 상속받은 클래스들이 engine에 테이블 형태로 생성됨

# 데이터 베이스에 session 연결
Session = sessionmaker(engine)

# 클래스를 return 받고
session = Session()
# 객체 생성

session 은 데이터 베이스와 연결된 객체입니다.데이터 베이스 접속 정보가 들어 있습니다. session을 통해 데이터 베이스에 데이터를 넣고, 삭제하고 수정해 보겠습니다.

데이터 베이스 연결 -> 테이블 객체 생성을 위한 클래스 작성 -> 데이터 베이스와 객체를 연결후 사용

1. Insert

session객체를 통해 데이터 배이스에 데이터를 넣어보겠습니다.

1
2
3
4
5
6
7
# insert
user = User("howard","howard@thisisemail.com",27,"2016-03-21")

# session 객체에 데이터가 저장
session.add(user)
# run tranaction : 이순간 데이터 베이스에 저장
session.commit()
여러 동작을 한 tranction으로 묶어서 tranaction이 실행되는 동안은 다른 Task가 들어오지 못합니다.(예: 은행 계좌 출금 과정)

insert 여러개 해보면

1
2
3
4
5
6
users = [
User("alice","alice@gmail.com",25,"2018-02-21"),
User("andy","andy@daum.net",33,"2015-10-21"),
]
session.add_all(users) # 데이터 저장
session.commit() # commit으로 데이터 베이스에 저장

rollback : session안에 있는 객체를 초기화 시킵니다.

1
session.rollback()

2. Select

SQL의 Select처럼 데이터 프레임의 데이터들을 봅시다.

1
2
# select all
results = session.query(User).all()

filter : ==, !=, >, <, <=, >=, like, in 등 SQL의 쿼리문 기능을 다 쓸수 있습니다. SQL WHERE 처럼 사용 가능합니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
results = session.query(User).filter(User.name=="howard")

# filter : like
results = session.query(User).filter(User.email.like("%gmail%"))

# filter : in_
results = session.query(User).filter(User.name.in_(["alice","andy"]))

# filter : or_
results = session.query(User).filter(or_(User.name == "howard", User.age == 33))

# order by : desc, asc(내림차순, 오름차순 정렬)
results = session.query(User).order_by(User.age.desc())

# count
session.query(User).count()

3. Updata

데이터 베이스의 데이터를 수정해봅시다.

1
2
3
4
5
6
7
8
# data에 andy의 row데이터 가져와서
data = session.query(User).filter(User.name == "howard").one()
# age라는 칸에 30 넣어주고
data.age = 30
# session에 담아서
session.add(data)
# commit
session.commit()

4. Delete

데이터를 삭제해 봅시다.

1
2
3
4
5
6
# delete row
session.query(User).filter(User.name == 'jin').delete()

# delete table
# User클래스에서 지정된 테이블인 user만 지워짐
User.__table__.drop(engine)

5. With Pandas

판다스와 함께 사용해봅시다.

1
2
3
4
5
6
7
8
9
import seaborn as sns
import pandas as pd
# 데이터 프레임을 데이터 베이스에 넣기
iris_df = sns.load_dataset("iris")

# iris_df 데이터를 iris라는 이름으로
# engine에서 지정된 데이터 베이스로 보냅니다.
# 만약 존재한다면 대체(replace)합니다.
iris_df.to_sql(name="iris",con=engine,if_exists="replace")