Advertisement
Guest User

Untitled

a guest
Aug 8th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.52 KB | None | 0 0
  1. Traceback (most recent call last):
  2. File "D:DanPythonXarphusxarphussubclass_master_data_load_data_item.py", line 151, in populate_item
  3. self.populate_item_signal.emit(next(self._element))
  4. File "D:DanPythonXarphusxarphuscoremanage_data_manipulation_master_data.py", line 232, in select_all
  5. yield record.id, record.relationship
  6. File "D:DanPythonXarphusxarphuscoremanage_db_connection.py", line 245, in __exit__
  7. self.session.commit()
  8. File "C:Python27libsite-packagessqlalchemyormsession.py", line 906, in commit
  9. self.transaction.commit()
  10. File "C:Python27libsite-packagessqlalchemyormsession.py", line 465, in commit
  11. t[1].commit()
  12. File "C:Python27libsite-packagessqlalchemyenginebase.py", line 1632, in commit
  13. self._do_commit()
  14. File "C:Python27libsite-packagessqlalchemyenginebase.py", line 1663, in _do_commit
  15. self.connection._commit_impl()
  16. File "C:Python27libsite-packagessqlalchemyenginebase.py", line 726, in _commit_impl
  17. self.connection._reset_agent is self.__transaction:
  18. File "C:Python27libsite-packagessqlalchemyenginebase.py", line 351, in connection
  19. self._handle_dbapi_exception(e, None, None, None, None)
  20. File "C:Python27libsite-packagessqlalchemyenginebase.py", line 1405, in _handle_dbapi_exception
  21. util.reraise(*exc_info)
  22. File "C:Python27libsite-packagessqlalchemyenginebase.py", line 349, in connection
  23. return self._revalidate_connection()
  24. File "C:Python27libsite-packagessqlalchemyenginebase.py", line 429, in _revalidate_connection
  25. raise exc.ResourceClosedError("This Connection is closed")
  26. ResourceClosedError: This Connection is closed
  27.  
  28. from PyQt4.QtCore import QObject, QThread, pyqtSignal, pyqtSlot, QTimer
  29. from PyQt4.QtGui import QApplication, QPushButton, QVBoxLayout, QDialog,
  30. QComboBox, QLabel
  31.  
  32. from sqlalchemy.ext.declarative import declarative_base
  33. from sqlalchemy import create_engine
  34. from sqlalchemy.exc import SQLAlchemyError
  35. from sqlalchemy.orm import sessionmaker, scoped_session
  36. from sqlalchemy import Table, Column, Integer, String, MetaData
  37.  
  38. from traceback import format_exc
  39. from sys import exc_info
  40.  
  41. ''' setting up root class for declarative declaration '''
  42. Base = declarative_base()
  43.  
  44. class PERSON_SALUTATION(Base):
  45.  
  46. __tablename__ = "person_salutation"
  47.  
  48. id = Column(Integer, primary_key=True)
  49. salutation = Column(String(50), nullable=False, unique=True)
  50.  
  51.  
  52. class MasterDataManipulation(object):
  53.  
  54. def __init__(self, session_object=None):
  55.  
  56. self._session_scope = session_object
  57.  
  58. def select_all(self):
  59.  
  60. try:
  61. with self._session_scope as session:
  62.  
  63. for record in session.query(PERSON_SALUTATION):
  64.  
  65. yield record.id, record.salutation
  66.  
  67. except AttributeError:
  68.  
  69. print "select all, desired_trace", format_exc(exc_info())
  70.  
  71. return
  72.  
  73. class Worker(QObject):
  74.  
  75. finish_progress = pyqtSignal()
  76. populate_item_signal = pyqtSignal(object, object)
  77.  
  78. def __init__(self,
  79. combo_box=None,
  80. query_data=None,
  81. parent=None):
  82. QObject.__init__(self, parent)
  83.  
  84. self.query_data = query_data
  85. self.combo_box=combo_box
  86.  
  87. ''' Create attributes '''
  88. self._run_semaphore = 1
  89.  
  90. def init_object(self):
  91.  
  92. self._element = self.query_data()
  93.  
  94. self.timer = QTimer()
  95.  
  96. self.timer.setSingleShot(False)
  97. self.timer.setInterval(1)
  98. self.timer.timeout.connect(self.populate_item)
  99. self.timer.start()
  100.  
  101. def populate_item(self):
  102. try:
  103.  
  104. if self._run_semaphore == 0:
  105.  
  106. self._run_semaphore = 1
  107.  
  108. raise StopIteration
  109.  
  110. else:
  111.  
  112. self.populate_item_signal.emit(next(self._element), self.combo_box)
  113.  
  114. except StopIteration:
  115.  
  116. print "StopIteration is raised"
  117.  
  118. self.timer.stop()
  119.  
  120. def stop(self):
  121. self._run_semaphore == 0
  122. self.timer.stop()
  123.  
  124. class SessionScope(object):
  125. def __init__(self, dbms=None, dbdriver=None,
  126. dbuser=None, dbuser_pwd=None,
  127. db_server_host=None, dbport=None, db_name=None,
  128. admin_database=None):
  129.  
  130. self.dbms = dbms
  131. self.dbdriver = dbdriver
  132. self.dbuser = dbuser
  133. self.dbuser_pwd = dbuser_pwd
  134. self.db_server_host = db_server_host
  135. self.dbport = dbport
  136. self.db_name = db_name
  137. self.admin_database = admin_database
  138.  
  139. url = '{}+{}://{}:{}@{}:{}/{}'.format(
  140. self.dbms, self.dbdriver, self.dbuser, self.dbuser_pwd, self.db_server_host, self.dbport, self.db_name)
  141.  
  142. self._Engine = create_engine(url, encoding='utf8', echo=True)
  143.  
  144. self.session = None
  145.  
  146. self._session_factory = sessionmaker(bind=self._Engine)
  147.  
  148. self._Session = scoped_session(sessionmaker(bind=self._Engine, expire_on_commit=False))
  149.  
  150. ''' create tables '''
  151. Base.metadata.create_all(self._Engine)
  152.  
  153. def __enter__(self):
  154. self.session = self._Session()
  155. return self.session
  156.  
  157. def __exit__(self, exception, exc_value, traceback):
  158.  
  159. try:
  160. if exception:
  161.  
  162. self.session.rollback()
  163. else:
  164.  
  165. self.session.commit()
  166.  
  167. finally:
  168.  
  169. self.session.close()
  170.  
  171. class MyCustomDialog(QDialog):
  172.  
  173. finish = pyqtSignal()
  174.  
  175. def __init__(self, scoped_session=None, parent=None):
  176. QDialog.__init__(self, parent)
  177.  
  178. self._session_scope = scoped_session
  179.  
  180. self._list_threads = []
  181.  
  182. self.init_ui()
  183. self.start_all_selection()
  184.  
  185. def init_ui(self):
  186.  
  187. layout = QVBoxLayout(self)
  188.  
  189. self.combo_person_title = QComboBox(self)
  190. self.combo_person_salutation = QComboBox(self)
  191. self.combo_person_gender = QComboBox(self)
  192. self.combo_person_religion = QComboBox(self)
  193. self.combo_person_relationship_status = QComboBox(self)
  194. self.combo_person_nationality = QComboBox(self)
  195. self.combo_person_eye_color = QComboBox(self)
  196. self.combo_person_hair_color = QComboBox(self)
  197.  
  198. self.pushButton_populate_combo = QPushButton("Re-populate", self)
  199. self.pushButton_stopp = QPushButton("Stopp", self)
  200. self.pushButton_close = QPushButton("Close", self)
  201. layout.addWidget(self.combo_person_title)
  202. layout.addWidget(self.combo_person_salutation)
  203. layout.addWidget(self.combo_person_gender)
  204. layout.addWidget(self.combo_person_religion)
  205. layout.addWidget(self.combo_person_nationality)
  206. layout.addWidget(self.combo_person_relationship_status)
  207. layout.addWidget(self.combo_person_eye_color)
  208. layout.addWidget(self.combo_person_hair_color)
  209. layout.addWidget(self.pushButton_populate_combo)
  210. layout.addWidget(self.pushButton_stopp)
  211. layout.addWidget(self.pushButton_close)
  212.  
  213. self.pushButton_stopp.clicked.connect(self.on_finish)
  214. self.pushButton_populate_combo.clicked.connect(self.start_all_selection)
  215. self.pushButton_close.clicked.connect(self.close)
  216.  
  217. def start_all_selection(self):
  218.  
  219. list_comboxes = self.findChildren(QComboBox)
  220.  
  221. for combo_box in list_comboxes:
  222. combo_box.clear()
  223. self.start_thread(combo_box=combo_box)
  224.  
  225. def fill_combo_boxt(self, item, combo_box):
  226. id, text = item
  227. combo_box.addItem(text)
  228.  
  229. def on_label(self, i):
  230. self.label.setText("Result: {}".format(i))
  231.  
  232. def start_thread(self, combo_box=None):
  233. master_data_manipulation = MasterDataManipulation(session_object=self._session_scope)
  234. query_data=master_data_manipulation.select_all
  235.  
  236. task_thread = QThread(self)
  237. task_thread.work = Worker(query_data=query_data,
  238. combo_box=combo_box,)
  239.  
  240. ''' We need to store threads '''
  241. self._list_threads.append(task_thread)
  242. task_thread.work.moveToThread(task_thread)
  243.  
  244. task_thread.work.populate_item_signal.connect(self.fill_combo_boxt)
  245.  
  246. self.finish.connect(task_thread.work.stop)
  247.  
  248. task_thread.started.connect(task_thread.work.init_object)
  249.  
  250. task_thread.finished.connect(task_thread.deleteLater)
  251.  
  252. ''' This will emit 'started' and start thread's event loop '''
  253. task_thread.start()
  254.  
  255. @pyqtSlot()
  256. def abort_workers(self):
  257. self.finish.emit()
  258. for thread in self._list_threads:
  259. ''' this will quit **as soon as thread event loop unblocks** '''
  260. thread.quit()
  261.  
  262. ''' so you need to wait for it to *actually* quit'''
  263. thread.wait()
  264.  
  265. def on_finish(self):
  266. self.finish.emit()
  267.  
  268. def closeEvent(self, event):
  269. ''' Re-implementaate to handle with created threads '''
  270. self.abort_workers()
  271.  
  272. sys.exit()
  273.  
  274. def populate_database(sess=None):
  275.  
  276. try:
  277.  
  278. with sess as session:
  279.  
  280. salutations = [PERSON_SALUTATION(salutation="Mister"),
  281. PERSON_SALUTATION(salutation="Miss"),
  282. PERSON_SALUTATION(salutation="Lady"),
  283. PERSON_SALUTATION(salutation="Ma'am"),
  284. PERSON_SALUTATION(salutation="Sir"),
  285. PERSON_SALUTATION(salutation="Queen"),
  286. PERSON_SALUTATION(salutation="Grandma"),]
  287. session.add_all(salutations)
  288.  
  289. session.commit()
  290.  
  291. except SQLAlchemyError:
  292. print "SQLAlchemyError", format_exc(exc_info())
  293.  
  294. def main():
  295. dbms = raw_input('Enter database type: ')
  296. dbdriver = raw_input('Enter database driver: ')
  297. dbuser = raw_input('Enter user name: ')
  298. dbuser_pwd = raw_input('Enter user password: ')
  299. db_server_host = raw_input('Enter server host: ')
  300. dbport = raw_input('Enter port: ')
  301. db_name = raw_input('Enter database name: ')
  302.  
  303. try:
  304. ''' create_engine and scoped_session once per process (per database). '''
  305. session_scope = SessionScope(dbms = dbms,
  306. dbdriver = dbdriver,
  307. dbuser = dbuser,
  308. dbuser_pwd = dbuser_pwd,
  309. db_server_host = db_server_host,
  310. dbport = dbport,
  311. db_name = db_name)
  312.  
  313. answer = raw_input('Do you want to populate database? Type yes or no: ')
  314.  
  315. if answer.lower() == 'yes':
  316. populate_database(sess=session_scope)
  317.  
  318. app = QApplication(sys.argv)
  319. window = MyCustomDialog(scoped_session = session_scope)
  320. window.show()
  321. sys.exit(app.exec_())
  322. except TypeError:
  323.  
  324. print "ERROR", format_exc(exc_info())
  325.  
  326. if __name__ == "__main__":
  327. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement