首页 > 解决方案 > 如何使用 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_datemodified_date。例如(13-JAN-21 04.23.41.343000000 +00:00)

我还想要该列中的时区值,例如。例如13-JAN-21 04.23.41.343000000 EUROPE/LONDON

请建议我在代码中做错了什么,如何使用sqlalchemy

标签: pythonoraclesqlalchemyflask-sqlalchemypython-datetime

解决方案


我找到了这个:掌握 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


推荐阅读