一、入門概述
Sqlalchemy是一個流行的Python ORM框架,官方提供完整的文檔和大量的示例供開發者使用。其中datetime模塊可以說是ORM框架中一大特色,它提供了轉換函數、時間點類型和時間段類型等。通過datetime模塊提供的各種功能,我們可以方便地處理時間戳、時間段、時間點等不同的時間類型。
Sqlalchemy.datetime模塊提供了DateTime和Time類型;提供了date(), time() 和datetime() 函數用於時間和日期的轉換,這裡的時間指的是時間點。如果需要處理時間段,可以使用Interval類型。
下面通過一些實際的例子來感受datetime模塊的強大性。
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, DateTime, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 創建資料庫連接
engine = create_engine('sqlite:///test.db')
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
created_at = Column(DateTime, server_default=func.now())
Session = sessionmaker(bind=engine)
session = Session()
# 插入數據
user = User(name='John')
session.add(user)
session.commit()
# 查詢數據
query = session.query(User).filter_by(name='John').one()
print(query.created_at)
二、日期格式化
在Sqlalchemy.datetime模塊中,我們可以使用不同的格式來表示相同的日期型字元串。因此需要對日期進行格式化和解析。Sqlalchemy中提供了一些函數可以方便地進行日期格式轉換。可以使用strftime()函數將datetime對象轉換為字元串,使用strptime()函數將字元串轉換為datetime對象。
import datetime
now = datetime.datetime.now()
print('Date:', now.strftime('%Y-%m-%d'))
print('Time:', now.strftime('%H:%M:%S'))
print('Datetime:', now.strftime('%Y-%m-%d %H:%M:%S'))
str_time = '2022-01-01 12:00:00'
datetime_obj = datetime.datetime.strptime(str_time,'%Y-%m-%d %H:%M:%S')
print('Datetime:', type(datetime_obj), datetime_obj)
三、時間間隔
Sqlalchemy提供了Interval類型,可以用於表示時間間隔。Interval是固定長度時間周期的類型,它支持以單獨欄位的形式表示不同時間周期(以毫秒、秒或天為單位)。可以用於計算時間差、限制數據訪問時間等場景。
from sqlalchemy import Interval
class Message(Base):
__tablename__ = 'messages'
id = Column(Integer, primary_key=True)
content = Column(String, nullable=False)
created_at = Column(DateTime, server_default=func.now())
expire_time = Column(DateTime, index=True,
server_default=func.now() + Interval(days=7))
session = Session()
# 插入數據
message = Message(content='Hello World')
session.add(message)
session.commit()
# 更新expire_time欄位,將時間往後推遲一天
query = session.query(Message).filter_by(content='Hello World')
query.update({Message.expire_time: Message.expire_time + Interval(days=1)})
session.commit()
# 查詢過期時間小於當前時間的消息
query = session.query(Message).filter(Message.expire_time < func.now())
for message in query.all():
print('Message "{}" expired at {}'.format(message.content, message.expire_time))
四、時區轉換
Sqlalchemy提供了timezone函數,可以用於時區轉換。可以在創建表和更新記錄時使用函數將本地時間與UTC時間之間轉換。Sqlalchemy還提供了一組函數,可以在不同的時間精度下進行時區轉換。
from sqlalchemy.sql import func
from sqlalchemy import text
# 創建函數
session.execute(text("CREATE EXTENSION IF NOT EXISTS timezone"))
session.execute(text("""
CREATE OR REPLACE FUNCTION convert_tz(p_input TIMESTAMP WITHOUT TIME ZONE,
p_from VARCHAR,
p_to VARCHAR)
RETURNS TIMESTAMP WITH TIME ZONE AS
$$
SELECT p_input AT TIME ZONE p_from AT TIME ZONE p_to;
$$
LANGUAGE sql;
"""))
# 創建表
class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True)
content = Column(String, nullable=False)
start_time = Column(DateTime, nullable=False)
end_time = Column(DateTime, nullable=False)
# 插入數據
session.add(Event(content='Meeting', start_time='2022-01-01 08:00:00', end_time='2022-01-01 10:00:00'))
session.commit()
# 查詢數據
query = session.query(Event,
func.convert_tz(Event.start_time, 'America/New_York', 'UTC'),
func.convert_tz(Event.end_time, 'America/New_York', 'UTC')
).all()
for event, start_time_utc, end_time_utc in query:
print('Event: {}, Start time: {}, End time: {}'.format(event.content, start_time_utc, end_time_utc))
五、時間比較與計算
Sqlalchemy提供了一系列函數,可以方便地進行時間比較和計算。比如可以使用datediff()函數計算兩個日期之間的天數差異,timediff()函數計算兩個時間之間的時間差異。Sqlalchemy還提供了很多函數可以用於特定的時間計算操作,比如使用timedelta()函數在datetime對象中添加或減去一段時間。
from sqlalchemy.sql import func
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
content = Column(String, nullable=False)
posted_at = Column(DateTime, nullable=False)
# 插入數據
post = Post(title='My Post', content='Hello World', posted_at='2022-01-01 00:00:00')
session.add(post)
session.commit()
# 查詢數據
query = session.query(Post).filter(func.date_diff('day', Post.posted_at, '2022-01-02')).all()
for post in query:
print('{}, posted_at: {}'.format(post.title, post.posted_at))
六、總結
Sqlalchemy.datetime模塊是Sqlalchemy ORM框架中非常實用的一個模塊。無論是日期格式化、時間段處理、時區轉換和時間操作,Sqlalchemy.datetime提供了非常方便和靈活的函數和類型,可以方便地滿足我們日常使用所需。在使用Sqlalchemy ORM框架的開發過程中,Sqlalchemy.datetime模塊的使用也是必不可少的部分。希望本文可以對大家對Sqlalchemy.datetime模塊有更深入的了解。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/237503.html