python - SQLAlchemy 使用 SQLite 丢失时区信息

标签 python database sqlite datetime sqlalchemy

我遇到一个问题,当 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/

相关文章:

python - django.db.models.Q 对象的 "|"和 "&"操作的中性元素?

mysql - 在一张表中添加第二个外键 - MySql

c# - 如何在 SQL 中获取二进制图像

database - SQLite3 的动态类型

Visual Studio 2012 中的 SQLite 1.0.82.0(最新)未显示在设计器数据源中

python - 列表索引超出范围 : Importing info from two lists into one conditionally

python - 如何将字符串字典转换为 Python 字典?

python - Ruby require 相当于什么?

android - 简单查询 SQLite android

sqlite - 如何在 Sqlite 中指定主键