我想将sqlalchemy的会话对象发送到另一个类的函数。
从课程 OraDialog 的功能 oraconnect 到课程 oraconn 的 分配 功能。
实际上我需要在 oraconn 的另一个函数 map
中使用会话对象我无法将会话对象直接发送到 map 函数,因为它是一个插槽 - 它之前被触发。 我打算主要定义assign函数来获取会话对象。
错误:(包括打印语句)
<sqlalchemy.orm.session.Session object at 0x030808F0>
<sqlalchemy.orm.session.Session object at 0x030808F0>
This is in assign
None
This is in map
Traceback (most recent call last):
File "C:\Users\Arul\Desktop\dbvis\oraconn.py", line 44, in map
for t in self.s.query(tables):
AttributeError: 'NoneType' object has no attribute 'query'
oraconn类的赋值和映射函数:
def assign(self,s):
self.s=s
print self.s
print "This is in assign"
def map(self):
print self.s
print "This is in map"
self.table_no=0
for t in self.s.query(tables):
self.table_no=self.table_no+1
table_list.append(t.table_name)
self.item=QtCore.QStringList()
for c in self.s.query(columns):
self.item.append(c.column_name)
self.ui.list_col.addItems(self.item)
所以, assign函数正确接收对象。但是map函数不能使用它 - 它表示Nonetype
我的问题: 同一类的两个函数不能使用对象?
我一定做了些傻事 - 所以请指出......
(我使用的是windows7 / python 2.6 / PyQt4 / sqlalchemy / cx_oracle)
编辑:
通话类:
class OraDialog(QtGui.QDialog):
def __init__(self,parent=None):
QtGui.QDialog.__init__(self,parent)
self.odia=Ui_Dialog()
self.odia.setupUi(self)
self.uiobj=oraconn()
QtCore.QObject.connect(self.odia.but_con,QtCore.SIGNAL('clicked()'),self.uiobj.oraconnect)
def oraconnect(self):
self.setVisible(0)
eng_str="oracle://"+self.odia.line_user.text()+":"+self.odia.line_pass.text()+"@localhost:1521/"+self.odia.line_sid.text()+"?mode="+self.odia.line_role.text()
engine_str=str(eng_str)
engine=create_engine(engine_str)
Session=sessionmaker(engine)
self.s=Session()
print self.s
解决问题:
问题是 - 我创建了两个实例并从一个实例传递到另一个实例。
更正后的代码:
oraconn.assign(myapp,self.s)
其中
oraconn - &gt;类
分配 - &gt;奥拉康的功能
myapp - &gt; oraconn的一个例子,申请主要申请
self.s - &gt;我想传递的论点
谢谢Kirk ....
答案 0 :(得分:2)
如果您使用Qt,那么这可能是一个GUI应用程序。也许有线程问题;也许self
指的是不同的对象。只有你给我们的东西很难说清楚。在继续之前,请添加:
print self
靠近每个方法的顶部。至少那时你可以确认两者是否在同一个对象上运行。
在OraDialog。 init 中,您说self.uiobj=oraconn()
。这是给你问题的对象吗?如果是这样:请注意您正在创建一个实例变量,以便每个OraDialog对象都有一个不同的.uiobj对象。你可以尝试写一个类变量:
class OraDialog(QtGui.QDialog):
uiobj = oraconn()
def __init__() [...]
代替?也就是说,将uiobj
定义为属于该类的所有实例,而不仅仅是一个实例。
答案 1 :(得分:0)
您发布的代码似乎没问题,我无法发现任何明显的错误。
问题必须在呼叫方面。由于自引用可以明确地传递给方法(通过OraDialog.map(my_object)
,其中my_object
可以是任何东西)这完全可能。另请注意,这与范围无关。
您应该检查map
功能的调用代码。很可能它被称为assign
的其他对象。