SQLAlchemy νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό λ§μ€ν°νμ¬ λ ννλ ₯ μκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ λ°μ΄ν° λͺ¨λΈμ μν κ³μ°λ μμ±μ λ§λμΈμ. μ€μ μμ λ₯Ό ν΅ν΄ λ°°μ°μΈμ.
Python SQLAlchemy νμ΄λΈλ¦¬λ νλ‘νΌν°: κ°λ ₯ν λ°μ΄ν° λͺ¨λΈλ§μ μν κ³μ°λ μμ±
κ°λ ₯νκ³ μ μ°ν Python SQL ν΄ν·μ΄μ κ°μ²΄ κ΄κ³ν λ§€νΌ(ORM)μΈ SQLAlchemyλ λ°μ΄ν°λ² μ΄μ€μ μνΈ μμ©νκΈ° μν νλΆν κΈ°λ₯μ μ 곡ν©λλ€. μ΄ μ€μμ νμ΄λΈλ¦¬λ νλ‘νΌν°λ λ°μ΄ν° λͺ¨λΈ λ΄μμ κ³μ°λ μμ±μ μμ±νλ λ° νΉν μ μ©ν λκ΅¬λ‘ λ보μ λλ€. μ΄ λ¬Έμλ SQLAlchemy νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ΄ν΄νκ³ νμ©νκΈ° μν ν¬κ΄μ μΈ κ°μ΄λλ₯Ό μ 곡νμ¬, λ ννλ ₯ μκ³ μ μ§λ³΄μνκΈ° μ¬μ°λ©° ν¨μ¨μ μΈ μ ν리μΌμ΄μ μ ꡬμΆν μ μλλ‘ ν©λλ€.
SQLAlchemy νμ΄λΈλ¦¬λ νλ‘νΌν°λ 무μμΈκ°μ?
μ΄λ¦μμ μ μ μλ―μ΄, νμ΄λΈλ¦¬λ νλ‘νΌν°λ μ κ·Όνλ 컨ν μ€νΈμ λ°λΌ λ€λ₯΄κ² λμν μ μλ SQLAlchemyμ νΉλ³ν μ νμ νλ‘νΌν°μ λλ€. μ΄λ₯Ό ν΅ν΄ ν΄λμ€μ μΈμ€ν΄μ€μμ μ§μ μ κ·Ό(μΌλ° νλ‘νΌν°μ²λΌ)νκ±°λ SQL ννμ(컬λΌμ²λΌ)μμ μ¬μ©ν μ μλ μμ±μ μ μν μ μμ΅λλ€. μ΄λ μΈμ€ν΄μ€ μμ€ λ° ν΄λμ€ μμ€ μ κ·Όμ μν λ³λμ ν¨μλ₯Ό μ μν¨μΌλ‘μ¨ λ¬μ±λ©λλ€.
λ³Έμ§μ μΌλ‘ νμ΄λΈλ¦¬λ νλ‘νΌν°λ λͺ¨λΈμ λ€λ₯Έ μμ±μμ νμλ κ³μ°λ μμ±μ μ μνλ λ°©λ²μ μ 곡ν©λλ€. μ΄λ¬ν κ³μ°λ μμ±μ 쿼리μμ μ¬μ©λ μ μμΌλ©°, λͺ¨λΈ μΈμ€ν΄μ€μμ μ§μ μ κ·Όν μλ μμ΄ μΌκ΄λκ³ μ§κ΄μ μΈ μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€.
νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νλ μ΄μ ?
νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ μ¬λ¬ μ΄μ μ μ»μ μ μμ΅λλ€:
- ννλ ₯: 볡μ‘ν κ΄κ³μ κ³μ°μ λͺ¨λΈ λ΄μ μ§μ ννν μ μμ΄ μ½λλ₯Ό λ μ½κΈ° μ½κ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- μ μ§λ³΄μμ±: 볡μ‘ν λ‘μ§μ νμ΄λΈλ¦¬λ νλ‘νΌν° λ΄μ μΊ‘μνν¨μΌλ‘μ¨ μ½λ μ€λ³΅μ μ€μ΄κ³ μ ν리μΌμ΄μ μ μ μ§λ³΄μμ±μ ν₯μμν΅λλ€.
- ν¨μ¨μ±: νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μ§μ κ³μ°μ μννμ¬ μ ν리μΌμ΄μ κ³Ό λ°μ΄ν°λ² μ΄μ€ μλ² κ°μ μ μ‘ν΄μΌ νλ λ°μ΄ν° μμ μ€μΌ μ μμ΅λλ€.
- μΌκ΄μ±: λͺ¨λΈ μΈμ€ν΄μ€ μμ μ νλ SQL 쿼리λ₯Ό μμ±νλ κ΄κ³μμ΄ κ³μ°λ μμ±μ μ κ·ΌνκΈ° μν μΌκ΄λ μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€.
κΈ°λ³Έ μμ: μ 체 μ΄λ¦
κ°λ¨ν μμλΆν° μμν΄λ΄ μλ€: μ¬λμ μ΄λ¦κ³Ό μ±μΌλ‘ μ 체 μ΄λ¦μ κ³μ°νλ κ²μ λλ€.
λͺ¨λΈ μ μ
λ¨Όμ , `first_name`κ³Ό `last_name` 컬λΌμ κ°μ§ κ°λ¨ν `Person` λͺ¨λΈμ μ μν©λλ€.
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.hybrid import hybrid_property
Base = declarative_base()
class Person(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
def __repr__(self):
return f""
engine = create_engine('sqlite:///:memory:') # In-memory database for example
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
νμ΄λΈλ¦¬λ νλ‘νΌν° μμ±
μ΄μ , μ΄λ¦κ³Ό μ±μ μ°κ²°νλ `full_name` νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μΆκ°ν κ²μ λλ€.
class Person(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
@hybrid_property
def full_name(self):
return f\"{self.first_name} {self.last_name}\"
def __repr__(self):
return f\"\"
μ΄ μμμμ `@hybrid_property` λ°μ½λ μ΄ν°λ `full_name` λ©μλλ₯Ό νμ΄λΈλ¦¬λ νλ‘νΌν°λ‘ λ³νν©λλ€. `person.full_name`μ μ κ·Όνλ©΄ μ΄ λ©μλ λ΄λΆμ μ½λκ° μ€νλ©λλ€.
νμ΄λΈλ¦¬λ νλ‘νΌν° μ κ·Ό
λͺ κ°μ§ λ°μ΄ν°λ₯Ό μμ±νκ³ `full_name` νλ‘νΌν°μ μ κ·Όνλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
person1 = Person(first_name='Alice', last_name='Smith')
person2 = Person(first_name='Bob', last_name='Johnson')
session.add_all([person1, person2])
session.commit()
print(person1.full_name) # Output: Alice Smith
print(person2.full_name) # Output: Bob Johnson
쿼리μμ νμ΄λΈλ¦¬λ νλ‘νΌν° μ¬μ©
νμ΄λΈλ¦¬λ νλ‘νΌν°μ μ§μ ν νμ 쿼리μμ μ¬μ©ν λ λ°νλ©λλ€. `full_name`μ λ§μΉ μΌλ° 컬λΌμΈ κ²μ²λΌ νν°λ§ν μ μμ΅λλ€.
people_with_smith = session.query(Person).filter(Person.full_name == 'Alice Smith').all()
print(people_with_smith) # Output: []
νμ§λ§ μ μμλ κ°λ¨ν λλ±μ± κ²μ¬μλ§ μλν©λλ€. 쿼리μμ λ 볡μ‘ν μμ (μ: `LIKE`)μ μν΄μλ ννμ ν¨μλ₯Ό μ μν΄μΌ ν©λλ€.
ννμ ν¨μ μ μ
λ 볡μ‘ν SQL ννμμμ νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νλ €λ©΄ ννμ ν¨μλ₯Ό μ μν΄μΌ ν©λλ€. μ΄ ν¨μλ SQLAlchemyμκ² νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό SQL ννμμΌλ‘ λ³ννλ λ°©λ²μ μλ €μ€λλ€.
`full_name` νλ‘νΌν°μ λν `LIKE` 쿼리λ₯Ό μ§μνλλ‘ μ΄μ μμ λ₯Ό μμ ν΄λ΄ μλ€.
from sqlalchemy import func
class Person(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
@hybrid_property
def full_name(self):
return f\"{self.first_name} {self.last_name}\"
@full_name.expression
def full_name(cls):
return func.concat(cls.first_name, ' ', cls.last_name)
def __repr__(self):
return f\"\"
μ¬κΈ°μ `@full_name.expression` λ°μ½λ μ΄ν°λ₯Ό μΆκ°νμ΅λλ€. μ΄ λ°μ½λ μ΄ν°λ ν΄λμ€(`cls`)λ₯Ό μΈμλ‘ λ°μ `func.concat` ν¨μλ₯Ό μ¬μ©νμ¬ μ΄λ¦κ³Ό μ±μ μ°κ²°νλ SQL ννμμ λ°ννλ ν¨μλ₯Ό μ μν©λλ€. `func.concat`μ λ°μ΄ν°λ² μ΄μ€μ λ¬Έμμ΄ μ°κ²° ν¨μ(μ: SQLiteμ `||`, MySQL λ° PostgreSQLμ `CONCAT`)λ₯Ό λνλ΄λ SQLAlchemy ν¨μμ λλ€.
μ΄μ `LIKE` 쿼리λ₯Ό μ¬μ©ν μ μμ΅λλ€:
people_with_smith = session.query(Person).filter(Person.full_name.like('%Smith%')).all()
print(people_with_smith) # Output: []
κ° μ€μ : μΈν°
νμ΄λΈλ¦¬λ νλ‘νΌν°λ μΈν°(setter)λ₯Ό κ°μ§ μλ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ μλ‘μ΄ κ°μ λ°λΌ κΈ°λ³Έ μμ±μ μ λ°μ΄νΈν μ μμ΅λλ€. μ΄λ `@full_name.setter` λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μνλ©λλ€.
`full_name` νλ‘νΌν°μ μ 체 μ΄λ¦μ μ΄λ¦κ³Ό μ±μΌλ‘ λΆλ¦¬νλ μΈν°λ₯Ό μΆκ°ν΄λ΄ μλ€.
class Person(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
@hybrid_property
def full_name(self):
return f\"{self.first_name} {self.last_name}\"
@full_name.expression
def full_name(cls):
return func.concat(cls.first_name, ' ', cls.last_name)
@full_name.setter
def full_name(self, full_name):
parts = full_name.split()
self.first_name = parts[0]
self.last_name = ' '.join(parts[1:]) if len(parts) > 1 else ''
def __repr__(self):
return f\"\"
μ΄μ `full_name` νλ‘νΌν°λ₯Ό μ€μ ν μ μμΌλ©°, κ·Έλ¬λ©΄ `first_name`κ³Ό `last_name` μμ±μ΄ μ λ°μ΄νΈλ κ²μ λλ€.
person = Person(first_name='Alice', last_name='Smith')
session.add(person)
session.commit()
person.full_name = 'Charlie Brown'
print(person.first_name) # Output: Charlie
print(person.last_name) # Output: Brown
session.commit()
λ리ν°
μΈν°μ λ§μ°¬κ°μ§λ‘, `@full_name.deleter` λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ νμ΄λΈλ¦¬λ νλ‘νΌν°μ λν λ리ν°(deleter)λ₯Ό μ μν μλ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ `del person.full_name`μ μλν λ λ°μνλ λμμ μ μν μ μμ΅λλ€.
μ°λ¦¬ μμμμλ μ 체 μ΄λ¦μ μμ νλ©΄ μ΄λ¦κ³Ό μ±μ λͺ¨λ λΉμ°λλ‘ ν΄λ΄ μλ€.
class Person(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
@hybrid_property
def full_name(self):
return f\"{self.first_name} {self.last_name}\"
@full_name.expression
def full_name(cls):
return func.concat(cls.first_name, ' ', cls.last_name)
@full_name.setter
def full_name(self, full_name):
parts = full_name.split()
self.first_name = parts[0]
self.last_name = ' '.join(parts[1:]) if len(parts) > 1 else ''
@full_name.deleter
def full_name(self):
self.first_name = None
self.last_name = None
def __repr__(self):
return f\"\"
person = Person(first_name='Charlie', last_name='Brown')
session.add(person)
session.commit()
del person.full_name
print(person.first_name) # Output: None
print(person.last_name) # Output: None
session.commit()
κ³ κΈ μμ: μλ μμΌλ‘λΆν° λμ΄ κ³μ°
λ 볡μ‘ν μμλ₯Ό κ³ λ €ν΄λ΄ μλ€: μ¬λμ μλ μμΌλ‘λΆν° λμ΄λ₯Ό κ³μ°νλ κ²μ λλ€. μ΄λ λ μ§λ₯Ό λ€λ£¨κ³ κ³μ°μ μννλ λ° μμ΄ νμ΄λΈλ¦¬λ νλ‘νΌν°μ κ°λ ₯ν¨μ 보μ¬μ€λλ€.
μλ μμΌ μ»¬λΌ μΆκ°
λ¨Όμ , `Person` λͺ¨λΈμ `date_of_birth` 컬λΌμ μΆκ°ν©λλ€.
from sqlalchemy import Date
import datetime
class Person(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
date_of_birth = Column(Date)
# ... (previous code)
νμ΄λΈλ¦¬λ νλ‘νΌν°λ‘ λμ΄ κ³μ°
μ΄μ `age` νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μμ±ν©λλ€. μ΄ νλ‘νΌν°λ `date_of_birth` 컬λΌμ κΈ°λ°μΌλ‘ λμ΄λ₯Ό κ³μ°ν©λλ€. `date_of_birth`κ° `None`μΈ κ²½μ°λ₯Ό μ²λ¦¬ν΄μΌ ν©λλ€.
from sqlalchemy import Date
import datetime
class Person(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
date_of_birth = Column(Date)
@hybrid_property
def age(self):
if self.date_of_birth:
today = datetime.date.today()
age = today.year - self.date_of_birth.year - ((today.month, today.day) < (self.date_of_birth.month, self.date_of_birth.day))
return age
return None # Or another default value
@age.expression
def age(cls):
today = datetime.date.today()
return func.cast(func.strftime('%Y', 'now') - func.strftime('%Y', cls.date_of_birth) - (func.strftime('%m-%d', 'now') < func.strftime('%m-%d', cls.date_of_birth)), Integer)
# ... (previous code)
μ€μ κ³ λ € μ¬ν:
- λ°μ΄ν°λ² μ΄μ€λ³ λ μ§ ν¨μ: ννμ ν¨μλ λ μ§ κ³μ°μ `func.strftime`μ μ¬μ©ν©λλ€. μ΄ ν¨μλ SQLiteμ νΉνλμ΄ μμ΅λλ€. λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€(μ: PostgreSQL λλ MySQL)μ κ²½μ°, μ μ ν λ°μ΄ν°λ² μ΄μ€λ³ λ μ§ ν¨μ(μ: PostgreSQLμ `EXTRACT`, MySQLμ `YEAR` λ° `MAKEDATE`)λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
- νμ μΊμ€ν : λ μ§ κ³μ° κ²°κ³Όλ₯Ό μ μλ‘ μΊμ€ν νκΈ° μν΄ `func.cast`λ₯Ό μ¬μ©ν©λλ€. μ΄λ `age` νλ‘νΌν°κ° μ μ κ°μ λ°ννλλ‘ λ³΄μ₯ν©λλ€.
- μκ°λ: λ μ§ μμ μ μκ°λμ μ μνμμμ€. λ μ§κ° μΌκ΄λ μκ°λλ‘ μ μ₯λκ³ λΉκ΅λλμ§ νμΈνμμμ€.
- `None` κ° μ²λ¦¬: μ€λ₯λ₯Ό λ°©μ§νλ €λ©΄ νλ‘νΌν°κ° `date_of_birth`κ° `None`μΈ κ²½μ°λ₯Ό μ²λ¦¬ν΄μΌ ν©λλ€.
λμ΄ νλ‘νΌν° μ¬μ©
person1 = Person(first_name='Alice', last_name='Smith', date_of_birth=datetime.date(1990, 1, 1))
person2 = Person(first_name='Bob', last_name='Johnson', date_of_birth=datetime.date(1985, 5, 10))
session.add_all([person1, person2])
session.commit()
print(person1.age) # Output: (Based on current date and birthdate)
print(person2.age) # Output: (Based on current date and birthdate)
people_over_30 = session.query(Person).filter(Person.age > 30).all()
print(people_over_30) # Output: (People older than 30 based on current date)
λ 볡μ‘ν μμ λ° μ¬μ© μ¬λ‘
μ μμκ±°λ μ ν리μΌμ΄μ μμ μ£Όλ¬Έ μ΄μ‘ κ³μ°
μ μμκ±°λ μ ν리μΌμ΄μ μμλ `OrderItem` λͺ¨λΈκ³Όμ κ΄κ³λ₯Ό κ°μ§ `Order` λͺ¨λΈμ κ°μ§ μ μμ΅λλ€. νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νμ¬ μ£Όλ¬Έμ μ΄ κ°μΉλ₯Ό κ³μ°ν μ μμ΅λλ€.
from sqlalchemy import ForeignKey, Float
from sqlalchemy.orm import relationship
class Order(Base):
__tablename__ = 'orders'
id = Column(Integer, primary_key=True)
items = relationship(\"OrderItem\", back_populates=\"order\")
@hybrid_property
def total(self):
return sum(item.price * item.quantity for item in self.items)
@total.expression
def total(cls):
return session.query(func.sum(OrderItem.price * OrderItem.quantity)).\
filter(OrderItem.order_id == cls.id).scalar_subquery()
class OrderItem(Base):
__tablename__ = 'order_items'
id = Column(Integer, primary_key=True)
order_id = Column(Integer, ForeignKey('orders.id'))
order = relationship(\"Order\", back_populates=\"items\")
price = Column(Float)
quantity = Column(Integer)
μ΄ μμλ λ°μ΄ν°λ² μ΄μ€μμ μ§μ μ΄κ³λ₯Ό κ³μ°νκΈ° μν΄ μλΈμΏΌλ¦¬λ₯Ό μ¬μ©νλ λ 볡μ‘ν ννμ ν¨μλ₯Ό 보μ¬μ€λλ€.
μ§λ¦¬μ κ³μ°
μ§λ¦¬ λ°μ΄ν°λ₯Ό λ€λ£¨λ κ²½μ°, νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νμ¬ μ§μ κ° κ±°λ¦¬λ₯Ό κ³μ°νκ±°λ νΉμ μ§μ λ΄μ μ§μ μ΄ μλμ§ νμΈν μ μμ΅λλ€. μ΄λ μ’ μ’ λ°μ΄ν°λ² μ΄μ€λ³ μ§λ¦¬ ν¨μ(μ: PostgreSQLμ PostGIS ν¨μ)λ₯Ό μ¬μ©νλ κ²μ ν¬ν¨ν©λλ€.
from geoalchemy2 import Geometry
from sqlalchemy import cast
class Location(Base):
__tablename__ = 'locations'
id = Column(Integer, primary_key=True)
name = Column(String)
coordinates = Column(Geometry(geometry_type='POINT', srid=4326))
@hybrid_property
def latitude(self):
if self.coordinates:
return self.coordinates.x
return None
@latitude.expression
def latitude(cls):
return cast(func.ST_X(cls.coordinates), Float)
@hybrid_property
def longitude(self):
if self.coordinates:
return self.coordinates.y
return None
@longitude.expression
def longitude(cls):
return cast(func.ST_Y(cls.coordinates), Float)
μ΄ μμλ `geoalchemy2` νμ₯ κΈ°λ₯μ νμλ‘ νλ©°, PostGISκ° νμ±νλ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ€κ³ κ°μ ν©λλ€.
νμ΄λΈλ¦¬λ νλ‘νΌν° μ¬μ©μ μν λͺ¨λ² μ¬λ‘
- κ°κ²°νκ² μ μ§: μλμ μΌλ‘ κ°λ¨ν κ³μ°μ νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νμμμ€. λ 볡μ‘ν λ‘μ§μ κ²½μ°, λ³λμ ν¨μλ λ©μλλ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμμμ€.
- μ μ ν λ°μ΄ν° νμ μ¬μ©: νμ΄λΈλ¦¬λ νλ‘νΌν°μμ μ¬μ©λλ λ°μ΄ν° νμ μ΄ Pythonκ³Ό SQL λͺ¨λμ νΈνλλμ§ νμΈνμμμ€.
- μ±λ₯ κ³ λ €: νμ΄λΈλ¦¬λ νλ‘νΌν°λ λ°μ΄ν°λ² μ΄μ€μμ κ³μ°μ μννμ¬ μ±λ₯μ ν₯μμν¬ μ μμ§λ§, 쿼리 μ±λ₯μ λͺ¨λν°λ§νκ³ νμμ λ°λΌ μ΅μ ννλ κ²μ΄ μ€μν©λλ€.
- μ² μ ν ν μ€νΈ: λͺ¨λ 컨ν μ€νΈμμ μ¬λ°λ₯Έ κ²°κ³Όλ₯Ό μμ±νλμ§ νμΈνκΈ° μν΄ νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ² μ ν ν μ€νΈνμμμ€.
- μ½λ λ¬Έμν: νμ΄λΈλ¦¬λ νλ‘νΌν°κ° 무μμ νλμ§, μ΄λ»κ² μλνλμ§ λͺ ννκ² λ¬Έμννμμμ€.
νν ν¨μ κ³Ό νΌνλ λ°©λ²
- λ°μ΄ν°λ² μ΄μ€λ³ ν¨μ: νΈνμ± λ¬Έμ λ₯Ό νΌνκΈ° μν΄ ννμ ν¨μκ° λ°μ΄ν°λ² μ΄μ€μ λ 립μ μΈ ν¨μλ₯Ό μ¬μ©νκ±°λ λ°μ΄ν°λ² μ΄μ€λ³ ꡬνμ μ 곡νλμ§ νμΈνμμμ€.
- μλͺ»λ ννμ ν¨μ: ννμ ν¨μκ° νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ ν¨ν SQL ννμμΌλ‘ μ¬λ°λ₯΄κ² λ³ννλμ§ λ€μ νμΈνμμμ€.
- μ±λ₯ λ³λͺ© νμ: λ무 볡μ‘νκ±°λ 리μμ€ μ§μ½μ μΈ κ³μ°μ νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©νλ κ²μ νΌνμμμ€. μ΄λ μ±λ₯ λ³λͺ© νμμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- μ΄λ¦ μΆ©λ: νΌλκ³Ό μ€λ₯λ₯Ό μΌκΈ°ν μ μμΌλ―λ‘ νμ΄λΈλ¦¬λ νλ‘νΌν°μ λͺ¨λΈμ 컬λΌμ λμΌν μ΄λ¦μ μ¬μ©νμ§ λ§μμμ€.
κ΅μ ν κ³ λ € μ¬ν
κ΅μ νλ μ ν리μΌμ΄μ μμ νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό μ¬μ©ν λ λ€μ μ¬νμ κ³ λ €νμμμ€:
- λ μ§ λ° μκ° νμ: λ€μν λ‘μΌμΌμ μ ν©ν λ μ§ λ° μκ° νμμ μ¬μ©νμμμ€.
- μ«μ νμ: μμμ κ΅¬λΆ κΈ°νΈμ μ² λ¨μ κ΅¬λΆ κΈ°νΈλ₯Ό ν¬ν¨νμ¬ λ€μν λ‘μΌμΌμ μ ν©ν μ«μ νμμ μ¬μ©νμμμ€.
- ν΅ν νμ: ν΅ν κΈ°νΈμ μμμ μλ¦Ώμλ₯Ό ν¬ν¨νμ¬ λ€μν λ‘μΌμΌμ μ ν©ν ν΅ν νμμ μ¬μ©νμμμ€.
- λ¬Έμμ΄ λΉκ΅: λ€μν μΈμ΄μμ λ¬Έμμ΄μ΄ μ¬λ°λ₯΄κ² λΉκ΅λλλ‘ λ‘μΌμΌ μΈμ λ¬Έμμ΄ λΉκ΅ ν¨μλ₯Ό μ¬μ©νμμμ€.
μλ₯Ό λ€μ΄, λμ΄λ₯Ό κ³μ°ν λ μ μΈκ³μ μΌλ‘ μ¬μ©λλ λ€μν λ μ§ νμμ κ³ λ €νμμμ€. μΌλΆ μ§μμμλ λ μ§λ₯Ό `MM/DD/YYYY`λ‘ μμ±νλ λ°λ©΄, λ€λ₯Έ μ§μμμλ `DD/MM/YYYY` λλ `YYYY-MM-DD`λ‘ μμ±ν©λλ€. μ½λκ° λͺ¨λ νμμ λ μ§λ₯Ό μ¬λ°λ₯΄κ² νμ±νλμ§ νμΈνμμμ€.
λ¬Έμμ΄μ μ°κ²°ν λ(`full_name` μμμ²λΌ) μ΄λ¦ μμμ λ¬Ένμ μ°¨μ΄λ₯Ό μΈμ§νμμμ€. μΌλΆ λ¬ΈνκΆμμλ μ±μ΄ μ΄λ¦ μμ μ΅λλ€. μ¬μ©μμκ² μ΄λ¦ νμ νμμ μ¬μ©μ μ μν μ μλ μ΅μ μ μ 곡νλ κ²μ κ³ λ €νμμμ€.
κ²°λ‘
SQLAlchemy νμ΄λΈλ¦¬λ νλ‘νΌν°λ λ°μ΄ν° λͺ¨λΈ λ΄μμ κ³μ°λ μμ±μ μμ±νκΈ° μν κ°λ ₯ν λꡬμ λλ€. μ΄λ₯Ό ν΅ν΄ 볡μ‘ν κ΄κ³μ κ³μ°μ λͺ¨λΈμ μ§μ νννμ¬ μ½λ κ°λ μ±, μ μ§λ³΄μμ± λ° ν¨μ¨μ±μ ν₯μμν¬ μ μμ΅λλ€. νμ΄λΈλ¦¬λ νλ‘νΌν°, ννμ ν¨μ, μΈν° λ° λ리ν°λ₯Ό μ μνλ λ°©λ²μ μ΄ν΄ν¨μΌλ‘μ¨ μ΄ κΈ°λ₯μ νμ©νμ¬ λ μ κ΅νκ³ κ²¬κ³ ν μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.
μ΄ λ¬Έμμ μ€λͺ λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ μΌλ°μ μΈ ν¨μ μ νΌν¨μΌλ‘μ¨, νμ΄λΈλ¦¬λ νλ‘νΌν°λ₯Ό ν¨κ³Όμ μΌλ‘ νμ©νμ¬ SQLAlchemy λͺ¨λΈμ ν₯μμν€κ³ λ°μ΄ν° μ κ·Ό λ‘μ§μ λ¨μνν μ μμ΅λλ€. μ μΈκ³ μ¬μ©μμκ² μ ν리μΌμ΄μ μ΄ μ¬λ°λ₯΄κ² μλνλλ‘ κ΅μ ν μΈ‘λ©΄μ κ³ λ €νλ κ²μ μμ§ λ§μμμ€. μ μ€ν κ³νκ³Ό ꡬνμ ν΅ν΄ νμ΄λΈλ¦¬λ νλ‘νΌν°λ SQLAlchemy ν΄ν·μ κ·μ€ν λΆλΆμ΄ λ μ μμ΅λλ€.