#python #object #sqlalchemy #pyqt4
#python #объект #sqlalchemy #pyqt4
Вопрос:
Я хочу отправить объект сеанса sqlalchemy в функцию другого класса .
От функции OraDialog класса oraconnect к функции assign класса oraconn .
На самом деле мне нужно использовать объект session в 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:UsersArulDesktopdbvisoraconn.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 -> класс
назначить -> функция oraconn
myapp -> экземпляр oraconn, объявленный для основного приложения
self.s -> аргумент, который я хотел передать
Спасибо, Кирк ….
Комментарии:
1. Покажите код, который приводит к этому. Как вызываются методы
assign
иmap
?2. Ваш первый фрагмент кода помечен как «Функция oraconnect класса OraDialog :». Я не могу понять, что вы там имеете в виду. Являются ли оба этих метода классом с именем OraDialog?
3. @Kirk Strauser, упс, извините, моя ошибка … сейчас я отредактировал .
Ответ №1:
Если вы используете Qt, то это, скорее всего, приложение с графическим интерфейсом. Возможно, есть проблемы с потоковой передачей; возможно, self
ссылается на разные объекты. Трудно сказать только по тому, что вы нам дали. Прежде чем вы пойдете дальше, добавьте:
print self
в верхней части каждого метода. По крайней мере, тогда вы сможете подтвердить, работают ли оба с одним и тем же объектом.
В OraDialog.init, вы говорите self.uiobj=oraconn()
. Это тот объект, который вызывает у вас проблемы? Если это так: обратите внимание, что вы создаете at в качестве переменной экземпляра, так что каждый объект OraDialog имеет другой объект .uiobj. Не могли бы вы попробовать сделать это переменной класса, написав:
class OraDialog(QtGui.QDialog):
uiobj = oraconn()
def __init__() [...]
вместо этого? То есть, определите uiobj
как принадлежащие всем экземплярам класса, а не только одному экземпляру.
Комментарии:
1. да, я хочу открыть диалоговое окно, чтобы получить имя пользователя, пароль, а затем использовать их в QMainWindow…
2. я напечатал self в обеих функциях — получил два разных адреса. Кажется, вы правы — проблемы с потоками. Значения следующие: <__main__.объект oraconn в 0x02ED7660> это в assign <__main__.объект oraconn в 0x02DC4F18> это в map
Ответ №2:
Опубликованный вами код, похоже, в порядке, я не могу обнаружить никаких очевидных ошибок.
Проблема, должно быть, на стороне вызова. Поскольку ссылка на себя может быть передана явно методам (через OraDialog.map(my_object)
, где my_object
может быть что угодно), это вполне возможно. Также обратите внимание, что это не имеет ничего общего с областью видимости.
Вы должны проверить вызывающий код map
функции. Очень вероятно, что это вызывается для другого объекта как assign
.
Комментарии:
1. Обратите внимание, что вы не должны вызывать подобные методы. Это убивает полиморфизм, основу утиной типизации.
2. Я не говорил, что вы должны это делать, но это возможно, и это даже может быть причиной рассматриваемой проблемы. Вот почему я упомянул об этом.