我遇到一个问题,当 SQLAlchemy(版本 0.6.4 和 0.6.8)提交到 SQLite 数据库时,datetime
对象丢失了时区信息,其中的列用 SQLAlchemy 的 日期时间
类。 (我意识到 SQLAlchemy 正在将其转换为字符串并返回,我认为这是问题的一半)。
由于代码胜于 Eloquent ,我有以下示例/复制器:
import datetime, pytz, sqlalchemy
from sqlalchemy import create_engine, Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
class Example(Base):
__tablename__ = "example"
id = Column(Integer, primary_key=True)
date = Column(DateTime(timezone=True))
def __init__(self, date):
self.date = date
Base.metadata.create_all(engine)
aucklandtz = pytz.timezone('Pacific/Auckland')
exdatetime = datetime.datetime(2011,8,8,2,23)
print aucklandtz, exdatetime
# inject TZ to exdatetime:
injdatetime = aucklandtz.localize(exdatetime)
print injdatetime
newrecord = Example(injdatetime)
print newrecord.date
session.add(newrecord)
session.commit()
print newrecord.date
从控制台输出来看,主要是它将记录作为值 '2011-08-08 02:23:00.000000'
插入到 SQLite 中。
是否有解决此问题的简单方法,或者我是否需要将 TZ 信息添加到单独的列/将所有内容存储为时间戳并在格式之间进行调整?
最佳答案
Python 的 strptime
方法不支持 %z
格式化指令,因此无法从数据库中的字符串中获取时区。我想这就是它没有被存储的原因。
您有两个选择。您已经提到了一个 - 将时区存储在另一列中。
但是,针对此问题的一般推荐解决方案是不同的。不是在 Python 或数据库中使用 datetime
存储时区,而是在从用户,并且只在内部处理 UTC
。稍后,当您必须向用户显示结果时,将其转换为正确的时区。
这将实际时间与您不能依赖的东西分开。如果您的程序的用户从奥克兰搬到日本,或者新西兰政府改变了他们的时区怎么办?
关于python - SQLAlchemy 使用 SQLite 丢失时区信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6991457/