我正在尝试编写一些Python3来与Raritan Power IQ(http://www.raritan.com/products/power-management/power-iq/)系统上的后端PostgreSQL服务器进行交互。
我已经使用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
但是,我可以使用相同的凭据在pgAdminIII下访问相同的表(Aisles)(与公共不同,我实际上拥有所有这些表的权限。
是否有任何理由py-postgresql可能看不到这些视图?或者您可以从错误消息中选择哪些内容?
我怀疑它与PowerIQ使用混合大小写表名(例如“Aisle”)。但是,我不确定如何在psycopg中处理这些问题。我怎么修改说,我的cursor.execute喜欢引用表?
cursor.execute('SELECT * from "public.Aisles"')
也行不通。
干杯, 维克多
答案 0 :(得分:1)
你有没有尝试过这种方式:'从公共场所选择*。'过道“?
引用整个内容使其成为一个非限定(无架构)的表名,其中包含一个点。