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