cx_Oracle和SDO_GEOMETRY

时间:2013-10-03 01:22:14

标签: cx-oracle

我有一个快乐返回数据的cx_Oracle连接。然而,我遇到几何问题。它作为cx_Oracle对象返回,例如cx_Oracle.OBJECT位于0x3afc320。但是我无法访问它的属性,如下所示

import cx_Oracle
query = '''
select geometry from table
'''
cx_Oracle.makedsn(...)
db_conn = cx_Oracle.connect(...)
cursor = db_conn.cursor()
cursor.execute(query)
columns = [i[0].lower() for i in cursor.description]
results = []
for row in cursor:
    results.append(dict(zip(columns, row)))
db_conn.close()
print (results[0]['geometry'])
print results[0]['geometry'].SDO_ORDINATES
print results[0]['geometry'].SDO_GTYPE
print results[0]['geometry'].SDO_ELEM_INFO

由于?这些属性不可用?

import inspect
inspect.getmembers(results[0]['geometry'])
[('__class__', cx_Oracle.OBJECT),
('__delattr__',
<method-wrapper '__delattr__' of cx_Oracle.OBJECT object at 0x03AFC320>),
('__doc__', None),
('__format__', <function __format__>),
('__getattribute__',
<method-wrapper '__getattribute__' of cx_Oracle.OBJECT object at 0x03AFC320>),
('__hash__',
<method-wrapper '__hash__' of cx_Oracle.OBJECT object at 0x03AFC320>),
('__init__',
<method-wrapper '__init__' of cx_Oracle.OBJECT object at 0x03AFC320>),
('__new__', <function __new__>),
('__reduce__', <function __reduce__>),
('__reduce_ex__', <function __reduce_ex__>),
('__repr__',
<method-wrapper '__repr__' of cx_Oracle.OBJECT object at 0x03AFC320>),
('__setattr__',
<method-wrapper '__setattr__' of cx_Oracle.OBJECT object at 0x03AFC320>),
('__sizeof__', <function __sizeof__>),
('__str__',
<method-wrapper '__str__' of cx_Oracle.OBJECT object at 0x03AFC320>),
('__subclasshook__', <function __subclasshook__>),
('type', <cx_Oracle.ObjectType MDSYS.SDO_GEOMETRY>)]

当我使用sql developer并查看相关表时,字段'geometry'的类型为'SDO_GEOMETRY()'。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

如果您的表格如下所示:

create table TestGeometry (
    IntCol number(9) not null,
    Geometry sdo_geometry not null
);

并使用以下数据填充它:

insert into TestGeometry
values (1, sdo_geometry(2003, null, null, sdo_elem_info_array(1, 1003, 3),
    sdo_ordinate_array(1, 1, 5, 7)));

然后以下脚本将访问您要查找的数据:

connection = cx_Oracle.Connection("user/pw@tns")
cursor = connection.cursor()
cursor.execute("""
        select Geometry
        from TestGeometry
        where IntCol = 1""")
obj, = cursor.fetchone()
print(obj.SDO_ORDINATES)
print(obj.SDO_GTYPE)
print(obj.SDO_ELEM_INFO)

您始终可以使用此代码找出可用的属性:

for attr in obj.type.attributes:
    print(attr.name)

答案 1 :(得分:0)

我遇到了类似的问题。 sdo_geometry对象不会传输到请求客户端。我相信原因是内部几何存储为LOB。

在我的情况下,我需要简单地访问几何体,以便将sdo_geometry(SDO_UTIL.TO_WKTGEOMETRY)转换为字符数据,然后将其转换下来。

可能还有其他方法可以将对象转换为子组件。

希望它有所帮助, Ĵ