Как изменить возвращаемый из `outputtypehandler` тип данных datetime на строку?
Возможно ли изменить тип данных datetime, возвращаемых из outputtypehandler на строку формата yyyymmdd?
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType in (cx_Oracle.DB_TYPE_TIMESTAMP, cx_Oracle.DB_TYPE_DATE):
return cursor.var(datetime.date,cursor.arraysize)
Свободный перевод вопроса Change datetime.date type in outputtypehandler от участника @Babar
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Следующий код:
import cx_Oracle
connection = cx_Oracle.connect ('connection_string')
def OutputTypeHandler (cursor, name, defaultType, size, precision, scale):
if defaultType in (cx_Oracle.DB_TYPE_TIMESTAMP_TZ, cx_Oracle.DB_TYPE_DATE):
return cursor.var (cx_Oracle.STRING, arraysize=cursor.arraysize)
connection.outputtypehandler = OutputTypeHandler
with connection.cursor () as cursor:
sql = """
alter session set nls_date_format = 'YYYYMMDD' nls_timestamp_tz_format = 'YYYYMMDD'
"""
cursor.execute (sql)
sql = """select systimestamp, sysdate from dual"""
for r in cursor.execute(sql):
print(r)
Выведет:
('20201223', '20201223')
Если пользоваться NLS настройками формата даты на стороне клиента, как показано выше, не стоит забывать использовать session callback для выполнения ALTER с пулом сессий. Но возможно, было бы лучше явное преобраование с маской формата YYYYMMDD в самом SQL запросе.
Если интересуют другие типы дат с часовыми поясами, то нужно добавить их в условие if defaultType и ALTER.
Свободный перевод ответа от участника @Christopher Jones