Путаница при расшифровке кода ошибки Python-модуль для подключения к Oracle (cx_Oracle)

Вы все уволены. Помимо этого, мне нужна помощь в расшифровке кода ошибки, который я вижу при попытке использовать модуль cx_Oracle для подключения к базе данных Oracle. По какой-то безответственной и дебильной причине я использую Python2.7 вместо Python3000. Сообщение об ошибке, которое я вижу, выглядит следующим образом (скопируйте / вставьте, конечно):

>>> connection = cx_Oracle.connect('user', 'password123', 'db1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cx_Oracle.DatabaseError: DPI-1050: Oracle Client library is at version 11.2 but
must be at version 0.0 or higher
>>>

Я нашел ужасную документацию внутри самого модуля с помощью этой команды: help('cx_Oracle.connect')

Эта команда выдает следующую страницу, первая страница показана только для краткости:

Help on class Connection in cx_Oracle:

cx_Oracle.connect = class Connection(__builtin__.object)
 |  Methods defined here:
 |
 |  __enter__(...)
 |
 |  __exit__(...)
 |
 |  __init__(...)
 |      x.__init__(...) initializes x; see help(type(x)) for signature
 |
 |  __repr__(...)
 |      x.__repr__() <==> repr(x)
 |
 |  begin(...)
 |
 |  cancel(...)
 |
 |  changepassword(...)
 |
 |  close(...)
 |
 |  commit(...)
 |
 |  createlob(...)
 |
 |  cursor(...)
 |
 |  deq(...)
 |
 |  deqoptions(...)
 |
 |  enq(...)
 |
 |  enqoptions(...)
 |
 |  getSodaDatabase(...)
 |
 |  gettype(...)
 |
 |  msgproperties(...)
 |
 |  ping(...)
 |
 |  prepare(...)
-- More  -- 

Я нашел лучшее объяснение того, как использовать API, на следующей веб-странице: https://dzone.com/articles/python-code-can-connect-oracle

Интересно, почему авторы модуля не написали четких инструкций, как это сделал автор веб-страницы, например:

# Connect using the ordered parameters user, password and SID.
dbconn = cx_Oracle.connect('user', 'password' ,'SID')

Я также нашел дополнительную документацию по следующему адресу: https://developer.oracle.com/databases/database-for-python-developers-1

Эта документация может быть из другой эпохи и для более ранней реализации базы данных Oracle.

Из того, что я понял, этот плагин предназначен только для баз данных Oracle 11g и, возможно, ниже. Подключаемые базы данных, которые я использую, и обычные базы данных, отсутствие лучшего термина, все 12c. Этот плагин только для версии <=11 базы данных Oracle?

Копия / вставка ниже показывает баннер из одной из баз данных.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing op
ions

С уважением,

Тупой парень

----------------------ОБНОВИТЬ--------------------------- -------------------------

Я воспользовался полезной разработкой по совету этого программного проекта и теперь получаю новую ошибку. Я удалил некоторые вещи, которые, как мне кажется, мне не нужны, из моего пути относительно версии 11 БД Oracle и вижу новое сообщение об ошибке:

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (
Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> connection = cx_Oracle.connect('user', 'password', 'oracledb')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cx_Oracle.DatabaseError: DPI-1047: 32-bit Oracle Client library cannot be loaded
: "C:\app\client\corpDrone\product\12.1.0\client_1\bin\oci.dll is not the correct a
rchitecture". See https://oracle.github.io/odpi/doc/installation.html#windows fo
r help

Я понял. Я перешел по ссылке в сообщении об ошибке выше, а затем скачал 32-битное мгновенное клиентское программное обеспечение lite и поместил это как первое, что у меня на пути. Затем я последовал руководству и поместил файл tnsnames.ora в мою секунду, на которую ссылается переменная среды TNS_NAMES.:) Надеюсь, это поможет извините позже.:D

Еще более простой вариант - переустановить вашу реализацию Python. В моем случае мне нужен 64-битный Python для связи с 64-битным программным обеспечением СУБД Oracle.

1 ответ

Решение

Извиняюсь за путаницу. В сообщении об ошибке была ошибка. Это происходит только с очень старыми версиями клиентских библиотек Oracle. Я только что исправил это здесь: https://github.com/oracle/odpi/commit/d2fea3801286d054e18b0102e60a69907b7faa9a и это скоро будет выпущено как часть cx_Oracle 7.1.1.

Так что сообщение об ошибке действительно пытается сказать вам, что вам нужно иметь клиентские библиотеки Oracle версии 11.2 или выше, и у вас достаточно старая версия, чтобы она даже не знала, как сказать, какая это версия! Так что скорее всего 8i или 9i или ранние версии 10g. В этих старых версиях они часто хранились в c:\Windows\system32 и, таким образом, имеют приоритет над другими библиотеками, которые вы, возможно, установили. Вы можете форсировать проблему, установив переменную среды PATH, включив вначале C:\app\client\corporateDrone\product\12.1.0\client_1\bin. Если это не поможет, вам, возможно, придется найти и удалить старую версию OCI.dll - помните, что это повлияет на любое программное обеспечение, которое зависит от него!

Официальную документацию можно найти здесь: https://cx-oracle.readthedocs.io/en/latest/index.html. Существует запрос на улучшение, чтобы включить их во встроенную справку, которая, как вы отметили, не имеет ничего полезного.:-) Вы можете увидеть запрос на улучшение здесь: https://github.com/oracle/python-cx_Oracle/issues/175.

Надеюсь, это облегчит ваше замешательство!

Другие вопросы по тегам