Python JPype和JayDeBeAPI:AttributeError:“property”对象没有属性“isBeanAccessor”
为了尝试通过JDBC连接到数据库,我已经构建了JPypeJPype1-0.5.5.4以及JayDeBeAPI 0.1.4。这是RHEL。我可以使用驱动程序成功连接Python JPype和JayDeBeAPI:AttributeError:“property”对象没有属性“isBeanAccessor”,python,jdbc,jpype,jaydebeapi,Python,Jdbc,Jpype,Jaydebeapi,为了尝试通过JDBC连接到数据库,我已经构建了JPypeJPype1-0.5.5.4以及JayDeBeAPI 0.1.4。这是RHEL。我可以使用驱动程序成功连接 TrgtCnn = jaydebeapi.connect('com.ibm.as400.access.AS400JDBCDriver', ['jdbc:as400://<mask>','<mask>','<mask>'],
TrgtCnn = jaydebeapi.connect('com.ibm.as400.access.AS400JDBCDriver',
['jdbc:as400://<mask>','<mask>','<mask>'],
'/app/as/lib/jdbc/jt400.jar')
但我在执行SQL时在JPype中得到了这种回溯:
TrgtCrs = TrgtCnn.cursor()
TrgtCrs.execute("SELECT * FROM WA6U999S")
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-5d46ea8c382d> in <module>()
----> 1 TrgtCrs.execute("SELECT * FROM WA6U999S")
/app/as/opt/anaconda/lib/python2.7/site-packages/jaydebeapi/dbapi2.pyc in execute(self, operation, parameters)
356 parameters = ()
357 self._close_last()
--> 358 self._prep = self._connection.jconn.prepareStatement(operation)
359 self._set_stmt_parms(self._prep, parameters)
360 is_rs = self._prep.execute()
/app/as/opt/anaconda/lib/python2.7/site-packages/JPype1-0.5.5.4-py2.7-linux-x86_64.egg/jpype/_jclass.pyc in _getClassFor(javaClass)
66 return _CLASSES[name]
67
---> 68 pyJavaClass = _JavaClass(javaClass)
69 _CLASSES[name] = pyJavaClass
70 return pyJavaClass
/app/as/opt/anaconda/lib/python2.7/site-packages/JPype1-0.5.5.4-py2.7-linux-x86_64.egg/jpype/_jclass.pyc in __new__(mcs, jc)
123 elif not jc.isInterface():
124 bjc = jc.getBaseClass(jc)
--> 125 bases.append(_getClassFor(bjc))
126
127 if _JAVATHROWABLE is not None and jc.isSubclass("java.lang.Throwable"):
/app/as/opt/anaconda/lib/python2.7/site-packages/JPype1-0.5.5.4-py2.7-linux-x86_64.egg/jpype/_jclass.pyc in _getClassFor(javaClass)
66 return _CLASSES[name]
67
---> 68 pyJavaClass = _JavaClass(javaClass)
69 _CLASSES[name] = pyJavaClass
70 return pyJavaClass
/app/as/opt/anaconda/lib/python2.7/site-packages/JPype1-0.5.5.4-py2.7-linux-x86_64.egg/jpype/_jclass.pyc in __new__(mcs, jc)
166 for i in _CUSTOMIZERS:
167 if i.canCustomize(name, jc):
--> 168 i.customize(name, jc, bases, members)
169
170 # remove multiple bases that would cause a MRO problem
/app/as/opt/anaconda/lib/python2.7/site-packages/JPype1-0.5.5.4-py2.7-linux-x86_64.egg/jpype/_properties.pyc in customize(self, class_name, jc, bases, members)
68
69 def customize(self, class_name, jc, bases, members) :
---> 70 accessor_pairs = _extract_accessor_pairs(members)
71 for attr_name, (getter, setter) in accessor_pairs.items():
72 if attr_name in members:
/app/as/opt/anaconda/lib/python2.7/site-packages/JPype1-0.5.5.4-py2.7-linux-x86_64.egg/jpype/_properties.pyc in _extract_accessor_pairs(members)
46 if _is_java_method(members[property_name]):
47 continue
---> 48 if access == 'get' and member.isBeanAccessor():
49 try:
50 pair = accessor_pairs[property_name]
AttributeError: 'property' object has no attribute 'isBeanAccessor'
我不知道从哪里开始,似乎找不到任何与这个问题相关的内容。这似乎是
我没有访问AS/400数据库的权限,但我确实有一个Oracle XE数据库,我可以使用它来重现问题。我使用的Python代码如下所示:
#!/usr/bin/python
import jaydebeapi
conn = jaydebeapi.connect('oracle.jdbc.OracleDriver', ['jdbc:oracle:thin:@localhost:1521:XE', 'user', 'password'])
print conn
我找到了我认为可以解决这个问题的方法,我已经在上面的JPype问题上发布了这个方法。此修复程序用于编辑jpype/\u properties.py中的函数_extract\u accessor\u pairs,查找以下代码并用and替换or:
在做了这个改变之后,我所犯的错误消失了。欢迎您尝试此修复程序,看看它是否也适用于您。此修复程序已修复:顺便问一下:您是否尝试过它允许您使用jdbc+jpype进行更pythonic的访问,并在代码中隐藏java内容……哎呀,我没看到您已经在使用JayDeBeApi。谢谢@Luke,我已经使用了您的建议1:1来修复此问题bug@bastian:没问题,很高兴能帮忙。对于那些不知道的人来说,bastian是JPype项目的维护者之一。谢谢你们两位,这解决了我的问题!
for name, member in members.items():
if not (len(name) > _PROPERTY_ACCESSOR_PREFIX_LEN \
or _is_java_method(member)):
continue
# rest of loop omitted...