Я пытаюсь написать Python3 для взаимодействия с внутренним сервером PostgreSQL в Raritan Power IQ (http://www.raritan.com/products/power-management/power-iq/) система.
Я использовал pgAdminIII для подключения к серверу, и он прекрасно связывается с моими учетными данными. Я вижу базы данных, а также схемы в каждой базе данных.
Я сейчас использую py-postgresql, чтобы попытаться написать его, и решаю некоторые проблемы.
Я использую следующее для подключения:
postgresql.open("pq://odbcuser:password@XX.XX.XX.XX:5432/raritan")
для подключения к базе данных raritan, используя пользователя "odbcuser" и пароль "password" (нет, это не настоящий ... lol).
Похоже, что успешно подключился. Я могу выполнить несколько запросов, например
ps = db.prepare("SELECT * from pg_tables;")
ps()
удается перечислить все таблицы / представления в базе данных "raritan".
Однако затем я пытаюсь получить доступ к определенному представлению, и оно прерывается. База данных "raritan" имеет две схемы: "odbc" и "public".
Я могу получить доступ к представлениям из общедоступной схемы. E.g.:
ps = db.prepare("SELECT * from public.qrypwrall;")
ps()
работает в некоторой степени - я получаю ошибку «Отказано в доступе», так же как и я в pgAdminIII, поскольку моя учетная запись не имеет доступа к этому представлению, но синтаксически это выглядит нормально и находит таблицу.
Однако, когда я пытаюсь получить доступ к представлению в «odbc», оно просто ломается Например:
>>> ps = db.prepare("SELECT * from odbc.Aisles;")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\site-packages\postgresql\driver\pq3.py", line 2291, in prepare
ps._fini()
File "C:\Python31\lib\site-packages\postgresql\driver\pq3.py", line 1393, in _
fini
self.database._pq_complete()
File "C:\Python31\lib\site-packages\postgresql\driver\pq3.py", line 2538, in _
pq_complete
self.typio.raise_error(x.error_message, cause = getattr(x, 'exception', None
))
File "C:\Python31\lib\site-packages\postgresql\driver\pq3.py", line 471, in ra
ise_error
self.raise_server_error(error_message, **kw)
File "C:\Python31\lib\site-packages\postgresql\driver\pq3.py", line 462, in ra
ise_server_error
raise server_error
postgresql.exceptions.UndefinedTableError: relation "odbc.aisles" does not exist
CODE: 42P01
LOCATION: File 'namespace.c', line 268, in RangeVarGetRelid from SERVER
STATEMENT: [parsing]
statement_id: py:0x10ca1b0
string: SELECT * from odbc.Aisles;
CONNECTION: [idle]
client_address: 10.180.9.213/32
client_port: 2612
version:
PostgreSQL 8.3.7 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 2
0071124 (Red Hat 4.1.2-42)
CONNECTOR: [IP4] pq://odbcuser:***@10.180.138.121:5432/raritan
category: None
DRIVER: postgresql.driver.pq3.Driver
Тем не менее, я могу получить доступ к той же таблице (Aisles) штрафа в pgAdminIII, используя те же учетные данные (и в отличие от общедоступных, у меня фактически есть разрешения на все эти таблицы.
Есть ли причина, по которой py-postgresql может не видеть эти представления? Или что-нибудь, что вы можете выбрать из сообщений об ошибках?
У меня есть подозрение, что это связано с PowerIQ, использующим смешанный регистр для имен таблиц (например, "Проход"). Тем не менее, я не совсем уверен, как бороться с этим в psycopg. Как именно я изменил бы, скажем, мой cursor.execute хотел бы заключить в кавычки таблицу?
cursor.execute('SELECT * from "public.Aisles"')
тоже не работает.
Ура,
Victor