SQLAlchemy에서 기본 DateTime 사용하기
DateTime 칼럼 정의하기
DateTime
칼럼을 정의하려면 다음과 같이 Column
함수를 사용합니다.
from sqlalchemy import Column, DateTime
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
created_at = Column(DateTime, default=datetime.now())
위 코드에서 created_at
칼럼은 DateTime
데이터 형식으로 정의되고, 기본값으로 현재 날짜와 시간이 설정됩니다.
기본값 설정하기
기본값을 변경하려면 default
인수에 원하는 값을 지정하면 됩니다.
from datetime import datetime
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
created_at = Column(DateTime, default=datetime(2024, 6, 15))
위 코드에서 created_at
칼럼의 기본값은 2024년 6월 15일로 설정됩니다.
자동 업데이트 설정하기
onupdate
인수를 사용하면 칼럼 값이 자동으로 업데이트되도록 설정할 수 있습니다.
from sqlalchemy import Column, DateTime
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
updated_at = Column(DateTime, onupdate=datetime.now())
위 코드에서 updated_at
칼럼은 매번 레코드가 업데이트될 때마다 현재 날짜와 시간으로 자동 업데이트됩니다.
주의 사항
DateTime
칼럼은 데이터베이스 종류에 따라 다르게 표현될 수 있습니다. 예를 들어, PostgreSQL에서는TIMESTAMP
타입으로, MySQL에서는DATETIME
타입으로 표현됩니다.DateTime
칼럼에 값을 저장할 때는datetime
모듈의datetime
객체를 사용해야 합니다. 문자열 형식의 값을 저장하려면 먼저datetime
객체로 변환해야 합니다.
예제
다음은 DateTime
칼럼을 사용하는 간단한 예제입니다.
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String, DateTime
from datetime import datetime
engine = create_engine('sqlite:///mydatabase.db')
Base = declarative_base()
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
created_at = Column(DateTime, default=datetime.now())
updated_at = Column(DateTime, onupdate=datetime.now())
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# 새로운 레코드 추가
new_record = MyTable(name='John Doe')
session.add(new_record)
session.commit()
# 레코드 조회
record = session.query(MyTable).first()
print(f"ID: {record.id}")
print(f"Name: {record.name}")
print(f"Created at: {record.created_at}")
print(f"Updated at: {record.updated_at}")
# 레코드 업데이트
record.name = 'Jane Doe'
session.commit()
# 업데이트된 레코드 조회
updated_record = session.query(MyTable).first()
print(f"Updated name: {updated_record.name}")
print(f"Updated updated at: {updated_record.updated_at}")
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String, DateTime
from datetime import datetime
# 데이터베이스 연결 설정
engine = create_engine('sqlite:///mydatabase.db')
Base = declarative_base()
# 테이블 정의
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255))
email = Column(String(255), unique=True)
password = Column(String(255))
created_at = Column(DateTime, default=datetime.now())
updated_at = Column(DateTime, onupdate=datetime.now())
# 테이블 생성 (없으면 생성, 있으면 건드리지 않음)
Base.metadata.create_all(engine)
# 세션 객체 생성
Session = sessionmaker(bind=engine)
session = Session()
# 사용자 추가
new_user = User(name='John Doe', email='[email protected]', password='password123')
session.add(new_user)
session.commit()
# 사용자 정보 조회
user = session.query(User).filter_by(email='[email protected]').first()
print(f"ID: {user.id}")
print(f"Name: {user.name}")
print(f"Email: {user.email}")
print(f"Created at: {user.created_at}")
print(f"Updated at: {user.updated_at}")
# 사용자 정보 수정
user.name = 'Jane Doe'
session.commit()
# 수정된 사용자 정보 조회
updated_user = session.query(User).filter_by(email='[email protected]').first()
print(f"Updated name: {updated_user.name}")
print(f"Updated updated at: {updated_user.updated_at}")
- 데이터베이스 연결 설정:
create_engine()
함수를 사용하여 SQLite 데이터베이스에 연결을 설정합니다. - 테이블 정의:
Base
클래스를 상속받는User
클래스를 정의합니다. 이 클래스는id
,name
,email
,password
,created_at
,updated_at
칼럼을 가진users
테이블을 나타냅니다. - 테이블 생성:
Base.metadata.create_all(engine)
를 호출하여users
테이블을 데이터베이스에 생성합니다. - 세션 객체 생성:
sessionmaker()
함수를 사용하여 세션 객체를 생성합니다. 세션 객체는 데이터베이스와 상호 작용하는 데 사용됩니다. - 사용자 추가:
User
객체를 생성하고session.add()
를 사용하여 세션에 추가합니다.session.commit()
를 호출하여 변경 사항을 데이터베이스에 저장합니다. - 사용자 정보 조회:
session.query(User).filter_by(email='[email protected]').first()
를 사용하여[email protected]
이메일을 가진 사용자의 정보를 조회합니다. - 사용자 정보 수정:
user.name = 'Jane Doe'
와 같이 사용자 객체의 속성을 변경하여 사용자 정보를 수정합니다.session.commit()
를 호출하여 변경 사항을 데이터베이스에 저장합니다. - 수정된 사용자 정보 조회: 수정된 사용자 정보를 다시 조회하여 변경 사항이 적용되었는지 확인합니다.
SQLAlchemy에서 기본 DateTime 사용하기: 대체 방법
default_factory 인수 사용하기
default_factory
인수를 사용하여 칼럼 값을 생성하는 함수를 지정할 수 있습니다.
from sqlalchemy import Column, DateTime
from datetime import datetime
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
created_at = Column(DateTime, default_factory=lambda: datetime.now())
위 코드에서 created_at
칼럼의 기본값을 생성하는 함수는 datetime.now()
함수입니다.
TIMESTAMP 또는 DATETIME 데이터 형식 사용하기
데이터베이스 종류에 따라 TIMESTAMP
또는 DATETIME
데이터 형식을 직접 사용할 수 있습니다.
from sqlalchemy import Column, TIMESTAMP, DATETIME
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
created_at = Column(TIMESTAMP(True)) # PostgreSQL
created_at = Column(DATETIME) # MySQL
위 코드에서 created_at
칼럼은 PostgreSQL에서는 TIMESTAMP(True)
타입으로, MySQL에서는 DATETIME
타입으로 정의됩니다.
DateTime 객체 직접 사용하기
default
인수에 datetime
객체를 직접 지정할 수 있습니다.
from sqlalchemy import Column, DateTime
from datetime import datetime
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
created_at = Column(DateTime, default=datetime(2024, 6, 15))
event.before_insert 핸들러 사용하기
event.before_insert
핸들러를 사용하여 레코드 삽입 전에 created_at
칼럼 값을 설정할 수 있습니다.
from sqlalchemy import Column, DateTime
from datetime import datetime
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
created_at = Column(DateTime)
def before_insert(mapper, connection, instance):
instance.created_at = datetime.now()
event.before_insert(MyTable, before_insert)
위 코드에서 MyTable
레코드가 삽입되기 전에 before_insert
함수가 호출되어 created_at
칼럼 값을 현재 날짜와 시간으로 설정합니다.
from sqlalchemy import Column, DateTime
from datetime import datetime
class MyTable(Base):
__tablename__ = 'my_table'
id = Column(Integer, primary_key=True)
name = Column(String(255))
updated_at = Column(DateTime)
def before_update(mapper, connection, instance):
instance.updated_at = datetime.now()
event.before_update(MyTable, before_update)
주의 사항
DateTime
칼럼은 데이터베이스 종류
python date sqlalchemy