Tentando inserir data no mysql usando pyqt5 code

125 views
Skip to first unread message

Daniel Tauil

unread,
Nov 8, 2017, 1:23:26 AM11/8/17
to Python Brasil
Olá pessoal,

Alguém poderia me dar uma luz com o código a seguir? 
Fiz uma janela simples com apenas um campo para inserção de dados e um botão para inserir dados no database.
Quando executo o código, a janela é chamada, coloco um nome qualquer no campo de editline e quando clico no botão inserir, um popup do windows aparece dizendo que o Python parou de responder e me da um erro no python. (Process finished with exit code -2147483645)
Se alguém puder me ajudar, segue o código:


import MySQLdb
from PyQt5 import QtCore, QtGui, QtWidgets

conn = MySQLdb.connect(host="localhost", user="root", passwd="123456", db="test")
c = conn.cursor()


class Ui_MainWindow(object):
#def select(self):
# c.execute("SELECT id FROM client")
# return

def insert(self):
c.execute('INSERT INTO client(name) values("%s")' % (self.nameClient))
conn.commit()
conn.close()

def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(200, 200)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")

#self.labelCodClient = QtWidgets.QLabel(self.centralwidget)
#self.labelCodClient.setGeometry(QtCore.QRect(5, 10, 75, 23))
#self.labelCodClient.setObjectName("labelCodClient")

self.labelNameClient = QtWidgets.QLabel("Name Client", self.centralwidget)
self.labelNameClient.setGeometry(QtCore.QRect(5, 60, 75, 23))
self.labelNameClient.setObjectName("labelNameClient")

self.nameClient = QtWidgets.QLineEdit(self.centralwidget)
self.nameClient.setGeometry(QtCore.QRect(75, 60, 75, 23))
self.nameClient.setObjectName("nameClientInput")

self.insertButton = QtWidgets.QPushButton(self.centralwidget)
self.insertButton.setGeometry(QtCore.QRect(10, 100, 75, 23))
self.insertButton.setObjectName("insertButton")
self.insertButton.clicked.connect(self.insert)

self.quitButton = QtWidgets.QPushButton(self.centralwidget)
self.quitButton.setGeometry(QtCore.QRect(95, 100, 75, 23))
self.quitButton.setObjectName("quitButton")
self.quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)

MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.quitButton.setText(_translate("MainWindow", "Quit"))
self.insertButton.setText(_translate("MainWindow", "Insert"))


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())


SleX Luthor

unread,
Nov 9, 2017, 2:29:21 PM11/9/17
to Python Brasil
Olá Daniel tudo bem?

Sequinte tinha 3 problemas no seu codigo.
1) Vc quanto esta executando o comando sql esta construindo o SQL com formatacao python e passado a stringo pronta para o c.execute
Isso e um problema pois permite sqlinject e causa outros problemas. pra resolver isso utilize o segundo parametro do metodo execute para passar os parametros do seu sql como bind.
exe.:  
c.execute(
'INSERT INTO client(name) values(%s)',
(self.nameClient.text(),)
)

Repare que onde entra o parametro na sua query vc pode coloca somente %s sem precisar de coloca as aspas. o proprio componente resolve isso para vc.

2) Vc estava passadno o objeto self.nameClient e nao o valor do campo self.nameClient.text()

3) Ao executar o click do botão ao terminar o commit, voce esta fechando a conecao desta forma o segundo click no botao vai calsar um erro e nao vai executar, fechando seu programa.

conn.commit()
# conn.close()


Dica envelope seus codigos com try: except e de um print() ou jogque pra um log para poder ver o erro quando acontecer estes casos. ;)

[]s Espero ter ajudado.

Seque o codigo acertado.

import MySQLdb
from PyQt5 import QtCore, QtGui, QtWidgets

conn = MySQLdb.connect(host="localhost", user="root", passwd="123456", db="test")
c = conn.cursor()


class Ui_MainWindow(object):
#def select(self):
# c.execute("SELECT id FROM client")
# return

def insert(self):
c.execute(
            'INSERT INTO client(name) values(%s)',
(self.nameClient.text(),)
)
conn.commit()
# conn.close()

Daniel Tauil

unread,
Nov 9, 2017, 7:58:01 PM11/9/17
to Python Brasil
Obrigado SleX Luthor! Rodou perfeito o cód. com suas alterações!!! Valeu pelo help!! 
Reply all
Reply to author
Forward
0 new messages