Как восстановить информацию о таблицах из выбранных данных с помощью python и cx_Oracle

#python #oracle #cx-oracle

#python #Oracle #cx-oracle

Вопрос:

У меня есть несколько запросов Oracle, подобных этому, выполняемых с помощью cx_Oracle в моем скрипте python

 Select  bo.lxname, bt.mxname, bo.lxrev, bo.lxcrdate, bo.lxmoddate, uss.mxname, pol.mxname, st.mxname 
from pdm.lxbo_5DC2EDE2 bo 
INNER JOIN pdm.mxbustype bt ON bo.lxtype = bt.mxoid 
INNER JOIN pdm.mxuser uss ON bo.lxowner = uss.mxoid 
INNER JOIN pdm.mxpolicy pol ON bo.lxpolicy = pol.mxoid 
INNER JOIN pdm.mxstatereq st ON bo.lxstate = st.mxoid 
where bo.Lxoid = '713307622'
 

Я знаю, что могу использовать.описание из курсора для восстановления информации, такой как :

     cur = cx.cursor()
    cur.execute(query)
    desc = cur.description
 

Но описание возвращает мне только имена столбцов :

 [('LXNAME', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 128, 128, None, None, 1), ('MXNAME', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 128, 128, None, None, 1), ('LXREV', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 128, 128, None, None, 1), ('LXCRDATE', <cx_Oracle.DbType DB_TYPE_DATE>, 23, None, None, None, 1), ('LXMODDATE', <cx_Oracle.DbType DB_TYPE_DATE>, 23, None, None, None, 1), ('MXNAME', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 128, 128, None, None, 1), ('MXNAME', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 128, 128, None, None, 1), ('MXNAME', <cx_Oracle.DbType DB_TYPE_VARCHAR>, 128, 128, None, None, 1)]
 

Как вы можете видеть, существует несколько mxname, но с помощью этой информации невозможно указать, что это «mxname» связано с этой таблицей в моем коде.

Я искал дополнительную информацию внутри курсора, но ничего не нашел относительно таблиц.

Есть ли какой-нибудь простой способ восстановить таблицу, связанную со столбцом в моем скрипте python?

Ответ №1:

Невозможно узнать, из какой таблицы получен конкретный столбец в вашем запросе, просто изучив описание курсора. Однако вы можете использовать псевдоним в своем запросе, как показано ниже:

 Select
    bo.lxname as bo_lxname,
    bt.mxname as bt_mxname,
    bo.lxrev as bo_lxrev,
    bo.lxcrdate as bo_lxcrdate,
    bo.lxmoddate as bo_lxmoddate,
    uss.mxname as uss_maxname,
    pol.mxname as pol_maxname,
    st.mxname as st_mxname
from pdm.lxbo_5DC2EDE2 bo 
INNER JOIN pdm.mxbustype bt ON bo.lxtype = bt.mxoid 
INNER JOIN pdm.mxuser uss ON bo.lxowner = uss.mxoid 
INNER JOIN pdm.mxpolicy pol ON bo.lxpolicy = pol.mxoid 
INNER JOIN pdm.mxstatereq st ON bo.lxstate = st.mxoid 
where bo.Lxoid = '713307622'
 

С помощью этого запроса cursor.description будет содержать информацию, которая скажет вам, из какой таблицы она взята.

Комментарии:

1. Да, это своего рода решение! Но конечная цель, которую я представлял, состояла в том, чтобы сделать что-то общее, чтобы избежать создания словаря с переводом между псевдонимами и таблицами, поскольку у меня есть тонны таблиц, столбцов и запросов. Думал о скребке запросов, чтобы определить, какой псевдоним принадлежит какой таблице, чтобы перестроить структуру и связать описание курсора в порядке выбора. Но я не знаю, является ли это хорошим и чистым способом достижения этой цели.