如何解决如何使用python和postgresql存储时区感知日期时间
我正在尝试使用 python 和 postgresql 存储时区感知日期时间,但总是存在一个或另一个问题
尝试将用户保存到 postgresql 数据库时出现以下错误
asyncpg.exceptions.DataError: invalid input for query argument $1: datetime.datetime(2021,6,13,21,12,1... (can't subtract offset-naive and offset-aware datetimes)
from datetime import datetime
import pytz
def save_user(user: auth_schema.UserCreate):
query = "INSERT INTO users VALUES (nextval('users_id_seq'),:email,:password,'',:created_on,:last_login,False,True,:is_superuser)"
return database.execute(query,values={"email": user.email,"password": user.password,"created_on": datetime.Now(pytz.utc),"is_superuser": False})
那么我如何摆脱错误?
asyncpg.exceptions.DataError: invalid input for query argument $1: datetime.datetime(2021,1... (can't subtract offset-naive and offset-aware datetimes)
更新:
用户表的created_on
列的类型为 timestamp
解决方法
如果您想在 Postgresql 中存储时区感知时间戳,您需要将它们存储在类型为 timestamp with time zone
(或 timestamptz
,这是相同的)的列中。因此,表的 CREATE TABLE
语句应该看起来像
CREATE TABLE users (
...
created_on timestamp with time zone,...
);
如果表已经存在,可以通过执行来改变列类型
ALTER TABLE users ALTER COLUMN created_on TYPE timestamp with time zone;
在 psql 控制台中(在执行此操作之前备份您的数据)。
请注意,Postgresql 将始终存储 UTC 时间,因此在检索时间戳时,您需要将日期时间实例上的 tzinfo
属性设置为您想要的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。