vic57Пока примеры на git не привели меня к пониманию. По sql там какой-то совсем простой код. Попробовал переписать c использованием QDialog и по схеме постоянного открытия/закрытия соединения для каждой операции. Как-то так получилось:
from PyQt5 import QtWidgets,QtCore
import cx_Oracle
# from mainwindow import Ui_MainWindow
class Login(QtWidgets.QDialog):
def __init__(self,parent=None):
super().__init__(parent)
self.setUi()
def setUi(self):
self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
self.setFixedSize(400,200)
vbox = QtWidgets.QVBoxLayout()
self.button = QtWidgets.QPushButton("&Отправить")
self.lineEditUser = QtWidgets.QLineEdit()
self.lineEditPassword = QtWidgets.QLineEdit()
self.lineEditPassword.setEchoMode(QtWidgets.QLineEdit.Password)
self.lineEditDB = QtWidgets.QLineEdit()
groupBox = QtWidgets.QGroupBox()
form = QtWidgets.QFormLayout()
form.addRow("&Имя пользователя: ", self.lineEditUser)
form.addRow("&Пароль: ", self.lineEditPassword)
form.addRow("&База данных: ", self.lineEditDB)
groupBox.setLayout(form)
vbox.addWidget(groupBox)
vbox.addWidget(self.button)
self.setLayout(vbox)
self.button.clicked.connect(self.on_clicked)
# Насколько правильно использовать менеджер контекста? Вроде бы курсоры и соединения так закрываются автоматически.
def on_clicked(self):
self.user = self.lineEditUser.text()
self.password = self.lineEditPassword.text()
self.dns = self.lineEditDB.text()
try:
with cx_Oracle.connect(self.user,self.password,self.dns) as con:
pass
self.accept()
except cx_Oracle.DatabaseError as e:
self.show_message("Ошибка подключения к базе данных", "Ошибка базы данных: %s" % e)
def show_message(self, title, message):
QtWidgets.QMessageBox.warning(self, title, message)
class Window(QtWidgets.QMainWindow):
def __init__(self, parent=None,user="",password="",dns=""):
super().__init__(parent)
self._user = user
self._password = password
self._dns = dns
self.show_banner("select banner from v$version")
# self.ui = Ui_MainWindow()
# self.ui.setupUi(self)
# Правильно ли открывать соединения так каждый раз? Или существует какой-то другой способ получше?
def show_banner (self,sql):
try:
with cx_Oracle.connect(self._user,self._password,self._dns) as con:
cursor = con.cursor()
cursor.execute(sql)
for row in cursor:
print(row[0])
except cx_Oracle.DatabaseError as e:
self.show_message("Ошибка подключения к базе данных", "Ошибка базы данных: %s" % e)
def show_message(self, title, message):
QtWidgets.QMessageBox.warning(self, title, message)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
login = Login()
# Правильно ли так передавать учётные данные в главное окно?
if login.exec_() == QtWidgets.QDialog.Accepted:
window = Window(user=login.user, password=login.password, dns=login.dns)
window.show()
sys.exit(app.exec_())
Так лучше?