<jupyter_start><jupyter_text>SQLAlchemy- python에서 사용하는 ORM    - ORM(Object Relational Mapping)        - DB 테이블하고 맵핑이 되는 클래스를 선언해줘야 한다.        - SQL문법을 사용하지 않고 함수형태로 데이터베이스에서 데이터를 가져옵니다.        - 사용하는 DB를 변경하고 싶을 때는 접속엔진객체의 접속 정보만 바꿔주면 된다.        - 즉, oracle, mysql, postgress 등 각각 다른 문법을 가진 데이터베이스에 통일된 함수형태로 쿼리를 보내면 각각에 맞게 알아서 번역해줌<jupyter_code>from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# DB connect
engine = create_engine("mysql://root:dss8@172.16.31.10/test")
engine<jupyter_output><empty_output><jupyter_text>연결완료<jupyter_code># user2 table과 맵핑되는 클래스 선언
Base = declarative_base()
class User(Base):
    __tablename__ = 'user2' # 실제 table명과 같은 이름을 써야함.
    
    # user2 table과 같이 변수선언
    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
    
    def __repr__(self):
        return "<User {},{},{},{}".format(self.name, self.email, self.age, self.rdate)
# Base 객체에 engine 설정(연결합니다.)
Base.metadata.create_all(engine)
# session (session이 mysql하고 연결합니다.)
session_maker_obj = sessionmaker(bind=engine)
session = session_maker_obj()
# insert one
user = User("juno","<EMAIL>","26","2018-07-27")
user
session.add(user)
# insert many
users = [
    User("andy","<EMAIL>","36","2002-07-27"),
    User("alice","<EMAIL>","28","2016-07-27"),
]
users
# 순서가 있는 데이터를 넣어줘야함.
# users 데이터를 session안에 넣어줍니다.
session.add_all(users) 
# run tranaction
# session에 넣어준 데이터(user, users) mysql로 보내줍니다.
session.commit()
# rollback : session data clear기능
session.rollback()<jupyter_output><empty_output><jupyter_text>여러개의 테이블 적용은 각각의 클래스를 만들어줘야 한다.  Select<jupyter_code># all
results = session.query(User).all()
results<jupyter_output><empty_output><jupyter_text>DB에는 없어도 session에 들어있다면, 즉 commit전 상태라도 결과값으로 나온다,<jupyter_code># filter
# where절 느낌
results = session.query(User).filter(User.name == "andy")
list(results)
results = session.query(User).filter(User.name != "andy")
list(results)
results = session.query(User).filter(User.age > "26")
list(results)
# filter - like
results = session.query(User).filter(User.email.like("%gmail%") )
list(results)
# filter - in
results = session.query(User).filter(User.name.in_(["jin","andy"]) )
list(results)
# filter - (~) not
results = session.query(User).filter(~User.name.in_(["jin","andy"]) )
list(results)
# filter - or_, and_ - sqlalchemy에 있는 function
results = session.query(User).filter(or_(User.name == "jin", User.age == 26))
list(results)
results = session.query(User).filter(and_(User.age < 27, User.name == "juno"))
list(results)
# order_by
results = session.query(User).order_by(User.age.asc())
list(results)
results = session.query(User).order_by(User.age.desc())
list(results)
# count
results = session.query(User).count()
results
# update
juno = session.query(User).filter(User.name == "juno").one()
juno
juno.age = 20
juno
list(session.query(User))
session.commit()
# delete
session.query(User).filter(User.name == "jin").delete
list(session.query(User))
session.commit()
session.rollback()
session.close()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14974389876468816, 'fraction_numerical': 0.016571256402530883, 'mean_word_length': 4.743944636678201, 'pattern_counts': {'":': 0, '<': 22, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 1, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '350568', 'license': 'MIT', 'n_tokens_mistral': 1465, 'n_tokens_neox': 1574, 'n_words': 260, 'path': 'database/sqlalchemy.ipynb', 'repo_name': 'Junhojuno/TIL', 'size': '3351'}