python - 如何使用 sqlachemy 将 python 日期时间和时区信息的记录插入带有区域列的 Oracle 时间戳
问题描述
我有现有的 oracle 数据库,其中包含表'STUDENT'。下面是表的字段和数据类型:
ID -- NUMBER
NAME -- VARCHAR(100)
CREATED_DATE -- TIMESTAMP(6) WITH TIME ZONE DEFAULT current_timestamp allow null
MODIFIED_DATE -- TIMESTAMP(6) WITH TIME ZONE DEFAULT current_timestamp allow null
我可以使用 sqlalchemy 连接 oracle 数据库,如下所述:
from sqlalchemy.sql import select
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.ext.automap import automap_base
DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = '******'
PASSWORD = '******'
HOST = '*******'
PORT = 1521
SERVICE = '*****'
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE
engine = create_engine(ENGINE_PATH_WIN_AUTH, max_identifier_length=128, echo=True, connect_args={"encoding": "utf-8"})
Base = automap_base()
Base.prepare(self.engine, reflect=True)
我可以使用以下代码将 oracle 数据库中的表映射到 sqlalchemy 对象:
Base = automap_base()
Base.prepare(self.engine, reflect=True)
STUDENT = Base.classes.student
db_session = Session(engine)
在上面的代码之后,我编写了一个使用 sqlalchemy 将数据插入表的代码。
from datetime import datetime
from pytz import timezone
data = [(1, 'stud1'), (2,'stud2'), (3, 'stud3')]
for d in data:
date_created = datetime.now(timezone('Europe/London'))
date_modified = datetime.now(timezone('Europe/London'))
stud_record = STUDENT(id=d[0], name=d[1], created_date=date_created, modified_date = date_modified)
db_session.add(stud_record)
db_session.commit()
执行代码后,我可以将记录插入表中,但我可以在列中看到日期时间和时间戳created_date
值modified_date
。例如(13-JAN-21 04.23.41.343000000 +00:00)
我还想要该列中的时区值,例如。例如13-JAN-21 04.23.41.343000000 EUROPE/LONDON
请建议我在代码中做错了什么,如何使用sqlalchemy
?
解决方案
我找到了这个:掌握 Oracle+Python,第 2 部分:使用时间和日期,其中指出:
在日期时间上下文中需要记住的有关 cx_Oracle 4.3 的重要事项:
- 不支持 INTERVAL 和 TIMESTAMP WITH (LOCAL) TIME ZONE
我认为解决方案是这样的:
如果客户端发送一个没有时区信息的时间戳(python 似乎就是这种情况),那么 Oracle 默认时区为SESSIONTIMEZONE
.
ALTER SESSION SET TIME_ZONE = 'Europe/London'
连接到 Oracle 后在 python 中运行。或者设置环境变量ORA_SDTZ=Europe/London
推荐阅读
- oh-my-zsh - ZSH ᐅ 字符显示为安装了 Powerline 字体的框
- python - 检查用户列表是否对消息 discord.py rewrite 做出反应
- c - 预处理 Linux 源代码并保存到另一个目录
- emacs - org babel tangle 提取 src 代码但遇到错误的 stingp 错误
- amazon-web-services - Scraper 在上传到 aws 之前一直有效(.jp 链接除外)
- cocos2d-iphone - cocos2d 1.0.1 for Mac - 带有 Catalina 的 iMac 5K 上的文本输出问题
- javascript - JavaScript 对象数组未正确导入
- c++ - 确定 Qt 库链接
- visual-studio - Unity UI,2D 游戏到主菜单,时间刻度问题
- json - 我如何使用 ASP Classic 从回调 URL 中获取值