#python-3.x #database #db2 #odbc
Вопрос:
Я относительно новичок в работе с удаленными базами данных IBM. Я подключаюсь к удаленной базе данных IBM AS400 с помощью разъема ODBC Python3 в виртуальной среде Anaconda в Windows 10. Мое соединение, которое успешно работает, — это:
import pyodbc connection = pyodbc.connect( Driver='{iSeries Access ODBC Driver}', System='lt;hostgt;', database='lt;databasegt;', uid='lt;usernamegt;', pwd='lt;passwordgt;') c1 = connection.cursor() print('Connection established')
После подключения я запускаю эту команду, чтобы просмотреть список таблиц:
c1.execute("select table_name from sysibm.sqltables")
И я вижу все таблицы, которые мне нужно будет запросить. Но затем, когда я пытаюсь запросить содержимое определенной таблицы с помощью:
c1.execute("select * from lt;databasegt;.lt;tablegt; LIMIT 100")
Я получаю сообщение об ошибке:
ProgrammingError: ('42S02', '[42S02] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0204 - lt;tablegt; der Art *FILE in lt;databasegt; nicht gefunden. (-204) (SQLExecDirectW)')
(Это на немецком языке, это означает таблицу типа *ФАЙЛ в базе данных не найден)
(И я не использую угловые скобки, это просто для демонстрации)
Но такое программное обеспечение, как DBeaver, возвращает действительные данные для них обоих, для запроса списка таблиц и для конкретного запроса таблицы. Это только python выдает ошибку.
Может ли кто-нибудь указать, что я могу делать не так? Или что я могу запустить, чтобы точно определить проблему?
Комментарии:
1. Пожалуйста, выберите из
qsys2.tables
, аsysibm.sqltables
не потому, что первый проверяет, что у идентификатора авторизации есть права доступа, прежде чем возвращать строку, в то время как последний этого не делает. Драйвер i access также предоставляет средство отслеживания (см. документацию), которое вы можете использовать на стороне клиента, чтобы увидеть, что на самом деле происходит под прикрытием, хотя для интерпретации выходных данных вам требуется определенная компетентность.
Ответ №1:
lt;databasegt;.lt;tablegt;
это неверно.
В Db2 у вас есть схема базы данных-таблица
вы должны использовать lt;schemagt;.lt;tablegt;
, поскольку база данных была указана в строке подключения.
lt;databasegt;.lt;schemagt;.lt;tablegt;
поддерживается при подключении к удаленной базе данных из «локальной» базы данных…но только для базовых настроек. Db2 для IBM i не поддерживает, например, объединение «локальной» и удаленной таблиц.