【发布时间】:2021-04-19 06:20:39
【问题描述】:
我有现有的 oracle 数据库,其中包含表 'STUDENT'。下面是table的字段和数据类型:
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? 将 python 日期时间和时间戳值插入到 oracle 表列(TIMESTAMP(6) WITH TIME ZONE)中?
【问题讨论】:
-
你从
select TO_CHAR(created_date, 'YYYY-MM-DD HH24:MI:SS TZR')得到什么? -
@WernfriedDomscheit 我收到了这个回复
2021-01-13 08:40:41 +00。 -
你确定吗?时区
+00不存在,见SELECT * FROM V$TIMEZONE_NAMES WHERE tzname = '+00' -
是的,我从专栏中得到了相同的回复。
标签: python oracle sqlalchemy flask-sqlalchemy python-datetime