[Python] SQLAlchemy: 객체 기반 데이터 활용 SQLAlchemy ORM 개요 (Object Relational Mapping)(1)
[SQLAlchemy 활용 목차]
[Python] SQLAlchemy: ORM(Object Relational Mapping)
1. 객체 기반 데이터 활용 SQLAlchemy ORM 개요
2. ORM Filter로 조회 조건 활용
3. ORM filter와 filter_by 사용법 비교
4. ORM 쿼리 결과 부분 조회 처리
5. ORM을 이용한 테이블 조회 활용 예시
ORM(Object Relational Mapping)은
객체 지향 프로그래밍 언어의 객체를 이용하여 다양한 데이터 베이스의 호환되지 않는 부분을 변환하는 기술입니다.
데이터베이스가 바뀌어도 SQL 문장을 수정하지 않고 작동이 되도록 하거나 복잡한 쿼리대신 프로그래밍 객체기반으로 데이터를 처리 할 수 있습니다.
최근 퍼이썬기반에서 많이 사용하는 SQLAlchemy의 활용 측면에서 작성해 보았습니다.
SQLAlchemy는 Python 프로그래밍 언어를 사용하여 데이터베이스와 소통하는 도구로서, 다양한 데이터베이스와 쿼리 작업을 수행 할 수 있는 dialect(언어)을 지원합니다.
SQLAlchemy dialect는 다양한 개발 언어가 DBAPI 를 통해서 다양한 데이터베이스 시스템(예: MySQL, PostgreSQL, SQLite, Oracle 등)과 통신하는 인터페이스를 제공합니다.
SQLAlchemy dialect는 데이터베이스에 대한 연결 설정, 데이터 타입, SQL 문법 및 데이터베이스 특정 기능을 처리하는 데 사용됩니다.
SQLAlchemy 는 ORM Core를 딤당하는 ENGINE으로 다양한 SQL문을 추상화하여 처리 할 수 있습니다.
dialect(언어도구)와 Communication Pool을 통해서 데이터베이스와 통신하는 프로토콜과 다양한 데이터 베이스 연결이 가능합니다.
이렇게 함으로써 동일한 Python 코드를 사용하여 다른 데이터베이스 시스템과도 쉽게 전환 할 수 있는 유연성을 제공합니다.
SQLAlchemy dialect driver 를 사용하면 데이터베이스 시스템의 특정 문법, 기능, 데이터 타입 등을 쉽게 처리할 수 있습니다. 필요에 따라 원하는 dialect를 선택하여 다양한 데이터베이스와 작업을 수행하는 데 중요한 역할을 합니다.
예를 들어, MySQL을 사용하는 경우 SQLAlchemy에서는 MySQL dialect를 선택하여 MySQL에 특화된 SQL 문장을 생성하고 실행할 수 있습니다. 마찬가지로 PostgreSQL, SQLite, Oracle 등의 다른 데이터베이스 시스템에 대한 dialect도 제공됩니다. SQLAlchemy의 dialect는 SQLAlchemy ORM(Object Relational Mapper) 및 SQLAlchemy Core(데이터베이스와의 저수준 상호 작용) 모두에서 사용됩니다.
다음의 각 데이터베이스를 위한 설정 예들을 참고 바랍니다.
[SQLAlchemy engine for sqlite ]
engine =create_engine('sqlite:///mydb.sqlite')
[SQLAlchemy engine for in-memory ]
from sqlalchemy import create_engine
engine=create_engine('sqlite:///:memory:')
[SQLAlchemy engine for mysql, pmysql(DB-API) ]
engine = create_engine('mysql+pymydsql://root@localhost/mydb')
객체와 테이블 매핑 (Object mapping)
sqlalchemy.orm import declarative_base 또는 sqlalchemy.ext.declarative (deprecated)모듈을 이용하여 객체와 테이블의 칼럼을 정의 할 수 있습니다.
sqlalchemy.ext.declarative 모듈은 SQLAlchemy ORM(Object Relational Mapping)에서 사용되는 확장 모듈로, 데이터베이스 테이블과 Python 클래스를 매핑하여 상호작용할 수 있는 기능을 제공합니다. SQLAlchemy에서 ORM을 사용하고자 할 때 declarative를 사용하면, 클래스를 정의하여 데이터베이스 테이블의 구조를 정의하고, 객체를 생성하여 데이터베이스의 레코드를 조작할 수 있습니다.
객체 지향적인 방식으로 데이터베이스의 CRUD 작업을 수행할 수 있고, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
from sqlalchemy.ext.declarative import declarative_base
base=declarative_base()
SQLAlchemy의 Column 객체와 데이터 유형
1. BigInteger
2. Boolean
3. Date
4. DateTime
5. Float
6. Integer
7. Numeric
8. SmallInteger
9. String
10. Text
11. Time
#myclasses.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Numeric
base=declarative_base()
class Student(base):
__tablename__='Students'
StudentID=Column(Integer, primary_key=True)
name=Column(String)
age=Column(Integer)
marks=Column(Numeric)
SQLAlchemy 를 이용한 ORM 모델 예시
from sqlalchemy import create_engine, Column, Integer, String
#from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker
# 데이터베이스 연결 설정
engine = create_engine('sqlite:///example.db') # SQLite 데이터베이스 사용
Base = declarative_base()
# 모델 정의
class User(Base):
__tablename__ = 'users' # 테이블 이름 설정
id = Column(Integer, primary_key=True)
name = Column(String(50))
age = Column(Integer)
def __init__(self, name, age):
self.name = name
self.age = age
# 테이블 생성
Base.metadata.create_all(engine)
# 데이터 추가
new_user = User(name='Alice', age=25)
session = sessionmaker(bind=engine)()
session.add(new_user)
session.commit()
# 데이터 조회
user = session.query(User).filter_by(name='Alice').first()
print(f'ID: {user.id}, Name: {user.name}, Age: {user.age}')
# 세션 닫기
session.close()
* (참고) function is now available as sqlalchemy.orm.declarative_base(). ( declarative_base() deprecated since: 2.0)
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
age = Column(Integer)
퍼이썬 버전에 따라서 deprecated 오류가 있다면, sqlalchemy.orm.declarative_base() 로 수정을 하면 됩니다.
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
age = Column(Integer)
객체 기반 ORM을 이용하는 장점
1. ORM 패턴을 사용하여 데이터베이스와 객체 간의 매핑을 정의하고자 할 때: declarative를 사용하면 클래스 정의를 통해 데이터베이스 테이블의 구조를 정의하고, 해당 클래스의 객체를 생성하여 데이터베이스의 레코드를 조작할 수 있습니다.
2. ORM을 사용하여 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 간편하게 수행하고자 할 때: declarative를 사용하면 객체 지향적인 방식으로 데이터베이스 작업을 수행할 수 있으며, SQL 문법을 직접 사용하지 않아도 됩니다.
3. Python에서 데이터베이스와 상호작용하는 코드를 더 간결하고 가독성 높게 작성하고자 할 때: declarative를 사용하면 객체 지향적인 코드를 통해 데이터베이스와 상호작용할 수 있어, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
[SQLAlchemy 활용 목차]
[Python] SQLAlchemy: ORM(Object Relational Mapping)
1. 객체 기반 데이터 활용 SQLAlchemy ORM 개요
2. ORM Filter로 조회 조건 활용
3. ORM filter와 filter_by 사용법 비교
4. ORM 쿼리 결과 부분 조회 처리
5. ORM을 이용한 테이블 조회 활용 예시
'Programming' 카테고리의 다른 글
[Python] SQLAlchemy : ORM 쿼리 결과 부분 조회 처리 (4) (1) | 2023.04.06 |
---|---|
[Python] SQLAlchemy : ORM filter와 filter_by 사용법 비교(3) - filter_by (0) | 2023.04.06 |
[Python] SQLAlchemy: ORM Filter로 조회 조건 활용(2) - filter (2) | 2023.04.06 |
인기있는 모바일 개발에 필요한 파이썬 개발툴 (0) | 2023.03.08 |
(python) chatGPT를 이용한 String-Buffer로 파일 쓰기 (0) | 2023.03.02 |
(python)chatGPT로 파일 읽고 쓰기 코딩 연습 (0) | 2023.03.01 |
(자료구조) Linkedlist - 연결 리스트 구조와 종류별 python examples (0) | 2022.12.09 |